@hypequery/clickhouse 1.4.0-beta.2 → 1.4.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 +65 -2
- package/dist/cli/bin.js +65 -23
- package/dist/cli/generate-types.js +41 -3
- package/dist/core/cache/cache-manager.d.ts +4 -0
- package/dist/core/cache/cache-manager.d.ts.map +1 -0
- package/dist/core/cache/cache-manager.js +176 -0
- package/dist/core/cache/controller.d.ts +15 -0
- package/dist/core/cache/controller.d.ts.map +1 -0
- package/dist/core/cache/controller.js +58 -0
- package/dist/core/cache/key.d.ts +11 -0
- package/dist/core/cache/key.d.ts.map +1 -0
- package/dist/core/cache/key.js +26 -0
- package/dist/core/cache/providers/memory-lru.d.ts +31 -0
- package/dist/core/cache/providers/memory-lru.d.ts.map +1 -0
- package/dist/core/cache/providers/memory-lru.js +156 -0
- package/dist/core/cache/providers/noop.d.ts +7 -0
- package/dist/core/cache/providers/noop.d.ts.map +1 -0
- package/dist/core/cache/providers/noop.js +11 -0
- package/dist/core/cache/runtime-context.d.ts +30 -0
- package/dist/core/cache/runtime-context.d.ts.map +1 -0
- package/dist/core/cache/runtime-context.js +58 -0
- package/dist/core/cache/serialization.d.ts +6 -0
- package/dist/core/cache/serialization.d.ts.map +1 -0
- package/dist/core/cache/serialization.js +166 -0
- package/dist/core/cache/types.d.ts +52 -0
- package/dist/core/cache/types.d.ts.map +1 -0
- package/dist/core/cache/types.js +1 -0
- package/dist/core/cache/utils.d.ts +9 -0
- package/dist/core/cache/utils.d.ts.map +1 -0
- package/dist/core/cache/utils.js +30 -0
- package/dist/core/connection.d.ts.map +1 -1
- package/dist/core/connection.js +4 -3
- package/dist/core/cross-filter.d.ts +12 -9
- package/dist/core/cross-filter.d.ts.map +1 -1
- package/dist/core/cross-filter.js +9 -6
- package/dist/core/env/auto-client.browser.d.ts +3 -0
- package/dist/core/env/auto-client.browser.d.ts.map +1 -0
- package/dist/core/env/auto-client.browser.js +3 -0
- package/dist/core/env/auto-client.d.ts +9 -0
- package/dist/core/env/auto-client.d.ts.map +1 -0
- package/dist/core/env/auto-client.js +21 -0
- package/dist/core/features/aggregations.d.ts +18 -22
- package/dist/core/features/aggregations.d.ts.map +1 -1
- package/dist/core/features/aggregations.js +6 -6
- package/dist/core/features/analytics.d.ts +15 -19
- package/dist/core/features/analytics.d.ts.map +1 -1
- package/dist/core/features/analytics.js +2 -2
- package/dist/core/features/cross-filtering.d.ts +4 -24
- package/dist/core/features/cross-filtering.d.ts.map +1 -1
- package/dist/core/features/cross-filtering.js +0 -34
- package/dist/core/features/executor.d.ts +11 -9
- package/dist/core/features/executor.d.ts.map +1 -1
- package/dist/core/features/executor.js +14 -5
- package/dist/core/features/filtering.d.ts +32 -28
- package/dist/core/features/filtering.d.ts.map +1 -1
- package/dist/core/features/filtering.js +27 -26
- package/dist/core/features/joins.d.ts +7 -10
- package/dist/core/features/joins.d.ts.map +1 -1
- package/dist/core/features/pagination.d.ts +8 -10
- package/dist/core/features/pagination.d.ts.map +1 -1
- package/dist/core/features/pagination.js +15 -42
- package/dist/core/features/query-modifiers.d.ts +18 -21
- package/dist/core/features/query-modifiers.d.ts.map +1 -1
- package/dist/core/formatters/sql-formatter.d.ts.map +1 -1
- package/dist/core/formatters/sql-formatter.js +6 -0
- package/dist/core/join-relationships.d.ts +2 -1
- package/dist/core/join-relationships.d.ts.map +1 -1
- package/dist/core/query-builder.d.ts +69 -74
- package/dist/core/query-builder.d.ts.map +1 -1
- package/dist/core/query-builder.js +155 -114
- package/dist/core/tests/integration/pagination-test-tbc.js +1 -0
- package/dist/core/tests/integration/setup.d.ts +8 -1
- package/dist/core/tests/integration/setup.d.ts.map +1 -1
- package/dist/core/tests/integration/setup.js +55 -22
- package/dist/core/tests/integration/test-config.d.ts +2 -2
- package/dist/core/tests/integration/test-config.d.ts.map +1 -1
- package/dist/core/tests/integration/test-config.js +3 -4
- package/dist/core/tests/integration/test-data.json +190 -0
- package/dist/core/tests/test-utils.d.ts +18 -3
- package/dist/core/tests/test-utils.d.ts.map +1 -1
- package/dist/core/tests/test-utils.js +37 -10
- package/dist/core/types/builder-state.d.ts +25 -0
- package/dist/core/types/builder-state.d.ts.map +1 -0
- package/dist/core/types/builder-state.js +1 -0
- package/dist/core/types/select-types.d.ts +32 -0
- package/dist/core/types/select-types.d.ts.map +1 -0
- package/dist/core/types/select-types.js +1 -0
- package/dist/core/types/type-helpers.d.ts +5 -0
- package/dist/core/types/type-helpers.d.ts.map +1 -0
- package/dist/core/types/type-helpers.js +1 -0
- package/dist/core/utils/logger.d.ts +6 -0
- package/dist/core/utils/logger.d.ts.map +1 -1
- package/dist/core/utils/logger.js +7 -2
- package/dist/core/utils/predicate-builder.d.ts +29 -0
- package/dist/core/utils/predicate-builder.d.ts.map +1 -0
- package/dist/core/utils/predicate-builder.js +92 -0
- package/dist/core/utils/sql-expressions.d.ts +24 -10
- package/dist/core/utils/sql-expressions.d.ts.map +1 -1
- package/dist/core/utils/sql-expressions.js +7 -30
- package/dist/core/utils/streaming-helpers.d.ts +2 -0
- package/dist/core/utils/streaming-helpers.d.ts.map +1 -0
- package/dist/core/utils/streaming-helpers.js +137 -0
- package/dist/core/validators/filter-validator.d.ts +2 -1
- package/dist/core/validators/filter-validator.d.ts.map +1 -1
- package/dist/core/validators/value-validator.d.ts +2 -1
- package/dist/core/validators/value-validator.d.ts.map +1 -1
- package/dist/index.d.ts +11 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/types/base.d.ts +10 -15
- package/dist/types/base.d.ts.map +1 -1
- package/dist/types/clickhouse-types.d.ts +9 -4
- package/dist/types/clickhouse-types.d.ts.map +1 -1
- package/dist/types/filters.d.ts +1 -1
- package/dist/types/filters.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/schema.d.ts +19 -0
- package/dist/types/schema.d.ts.map +1 -0
- package/dist/types/schema.js +1 -0
- package/package.json +14 -12
- package/dist/core/tests/integration/test-initializer.d.ts +0 -7
- package/dist/core/tests/integration/test-initializer.d.ts.map +0 -1
- package/dist/core/tests/integration/test-initializer.js +0 -32
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
{
|
|
2
|
+
"test_table": [
|
|
3
|
+
{
|
|
4
|
+
"id": 1,
|
|
5
|
+
"name": "Product A",
|
|
6
|
+
"category": "A",
|
|
7
|
+
"price": 10.5,
|
|
8
|
+
"created_at": "2023-01-01 10:00:00",
|
|
9
|
+
"is_active": true,
|
|
10
|
+
"tags": [
|
|
11
|
+
"new",
|
|
12
|
+
"sale"
|
|
13
|
+
],
|
|
14
|
+
"attributes": {
|
|
15
|
+
"color": "red",
|
|
16
|
+
"size": "M"
|
|
17
|
+
},
|
|
18
|
+
"optional_note": "Popular item",
|
|
19
|
+
"sku": "A-100",
|
|
20
|
+
"delivery_dates": [
|
|
21
|
+
"2023-01-05",
|
|
22
|
+
"2023-01-10"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": 2,
|
|
27
|
+
"name": "Product B",
|
|
28
|
+
"category": "B",
|
|
29
|
+
"price": 20.75,
|
|
30
|
+
"created_at": "2023-01-02 12:30:00",
|
|
31
|
+
"is_active": true,
|
|
32
|
+
"tags": [
|
|
33
|
+
"featured"
|
|
34
|
+
],
|
|
35
|
+
"attributes": {
|
|
36
|
+
"color": "blue",
|
|
37
|
+
"size": "L"
|
|
38
|
+
},
|
|
39
|
+
"optional_note": null,
|
|
40
|
+
"sku": "B-200",
|
|
41
|
+
"delivery_dates": [
|
|
42
|
+
"2023-01-06"
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": 3,
|
|
47
|
+
"name": "Product C",
|
|
48
|
+
"category": "A",
|
|
49
|
+
"price": 15.0,
|
|
50
|
+
"created_at": "2023-01-03 09:45:00",
|
|
51
|
+
"is_active": false,
|
|
52
|
+
"tags": [],
|
|
53
|
+
"attributes": {
|
|
54
|
+
"color": "green",
|
|
55
|
+
"size": "S"
|
|
56
|
+
},
|
|
57
|
+
"optional_note": "Backordered",
|
|
58
|
+
"sku": "C-300",
|
|
59
|
+
"delivery_dates": []
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": 4,
|
|
63
|
+
"name": "Product D",
|
|
64
|
+
"category": "C",
|
|
65
|
+
"price": 8.25,
|
|
66
|
+
"created_at": "2023-01-04 15:15:00",
|
|
67
|
+
"is_active": true,
|
|
68
|
+
"tags": [
|
|
69
|
+
"clearance"
|
|
70
|
+
],
|
|
71
|
+
"attributes": {
|
|
72
|
+
"color": "yellow",
|
|
73
|
+
"size": "XL"
|
|
74
|
+
},
|
|
75
|
+
"optional_note": null,
|
|
76
|
+
"sku": "D-400",
|
|
77
|
+
"delivery_dates": [
|
|
78
|
+
"2023-01-08"
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"id": 5,
|
|
83
|
+
"name": "Product E",
|
|
84
|
+
"category": "B",
|
|
85
|
+
"price": 30.0,
|
|
86
|
+
"created_at": "2023-01-05 11:20:00",
|
|
87
|
+
"is_active": true,
|
|
88
|
+
"tags": [
|
|
89
|
+
"premium",
|
|
90
|
+
"gift"
|
|
91
|
+
],
|
|
92
|
+
"attributes": {
|
|
93
|
+
"color": "black",
|
|
94
|
+
"size": "M"
|
|
95
|
+
},
|
|
96
|
+
"optional_note": "Limited stock",
|
|
97
|
+
"sku": "E-500",
|
|
98
|
+
"delivery_dates": [
|
|
99
|
+
"2023-01-07",
|
|
100
|
+
"2023-01-09"
|
|
101
|
+
]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"id": 6,
|
|
105
|
+
"name": "Product F",
|
|
106
|
+
"category": "D",
|
|
107
|
+
"price": 12.5,
|
|
108
|
+
"created_at": "2023-01-06 14:40:00",
|
|
109
|
+
"is_active": false,
|
|
110
|
+
"tags": [],
|
|
111
|
+
"attributes": {
|
|
112
|
+
"color": "white",
|
|
113
|
+
"size": "M"
|
|
114
|
+
},
|
|
115
|
+
"optional_note": null,
|
|
116
|
+
"sku": "F-600",
|
|
117
|
+
"delivery_dates": []
|
|
118
|
+
}
|
|
119
|
+
],
|
|
120
|
+
"users": [
|
|
121
|
+
{
|
|
122
|
+
"id": 1,
|
|
123
|
+
"user_name": "john_doe",
|
|
124
|
+
"email": "john@example.com",
|
|
125
|
+
"status": "active",
|
|
126
|
+
"created_at": "2023-01-01"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"id": 2,
|
|
130
|
+
"user_name": "jane_smith",
|
|
131
|
+
"email": "jane@example.com",
|
|
132
|
+
"status": "active",
|
|
133
|
+
"created_at": "2023-01-02"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"id": 3,
|
|
137
|
+
"user_name": "bob_jones",
|
|
138
|
+
"email": "bob@example.com",
|
|
139
|
+
"status": "inactive",
|
|
140
|
+
"created_at": "2023-01-03"
|
|
141
|
+
}
|
|
142
|
+
],
|
|
143
|
+
"orders": [
|
|
144
|
+
{
|
|
145
|
+
"id": 1,
|
|
146
|
+
"user_id": 1,
|
|
147
|
+
"product_id": 1,
|
|
148
|
+
"quantity": 2,
|
|
149
|
+
"total": 21.0,
|
|
150
|
+
"status": "completed",
|
|
151
|
+
"created_at": "2023-01-10"
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"id": 2,
|
|
155
|
+
"user_id": 1,
|
|
156
|
+
"product_id": 3,
|
|
157
|
+
"quantity": 1,
|
|
158
|
+
"total": 15.0,
|
|
159
|
+
"status": "completed",
|
|
160
|
+
"created_at": "2023-01-11"
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"id": 3,
|
|
164
|
+
"user_id": 2,
|
|
165
|
+
"product_id": 2,
|
|
166
|
+
"quantity": 3,
|
|
167
|
+
"total": 62.25,
|
|
168
|
+
"status": "pending",
|
|
169
|
+
"created_at": "2023-01-12"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": 4,
|
|
173
|
+
"user_id": 2,
|
|
174
|
+
"product_id": 5,
|
|
175
|
+
"quantity": 1,
|
|
176
|
+
"total": 30.0,
|
|
177
|
+
"status": "completed",
|
|
178
|
+
"created_at": "2023-01-13"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": 5,
|
|
182
|
+
"user_id": 3,
|
|
183
|
+
"product_id": 4,
|
|
184
|
+
"quantity": 2,
|
|
185
|
+
"total": 16.5,
|
|
186
|
+
"status": "cancelled",
|
|
187
|
+
"created_at": "2023-01-14"
|
|
188
|
+
}
|
|
189
|
+
]
|
|
190
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { SelectQB } from '../query-builder.js';
|
|
2
|
+
import type { TableRecord } from '../../types/schema.js';
|
|
2
3
|
export type TestTableSchema = {
|
|
3
4
|
id: 'Int32';
|
|
4
5
|
name: 'String';
|
|
@@ -12,18 +13,32 @@ export type TestTableSchema = {
|
|
|
12
13
|
brand: 'String';
|
|
13
14
|
total: 'Int32';
|
|
14
15
|
priority: 'String';
|
|
16
|
+
is_premium: 'Bool';
|
|
17
|
+
metadata: 'Map(String, String)';
|
|
18
|
+
tags: 'Array(String)';
|
|
19
|
+
settings: 'Map(LowCardinality(String), String)';
|
|
20
|
+
optional_name: 'Nullable(String)';
|
|
21
|
+
categories: 'Array(LowCardinality(String))';
|
|
22
|
+
feature_flags: 'Array(Map(LowCardinality(String), String))';
|
|
23
|
+
optional_tags: 'Nullable(Array(String))';
|
|
24
|
+
permissions: 'Map(String, Array(String))';
|
|
25
|
+
created_timestamp: 'DateTime64(9)';
|
|
15
26
|
};
|
|
16
27
|
export type UsersSchema = {
|
|
17
28
|
id: 'Int32';
|
|
18
29
|
user_name: 'String';
|
|
19
30
|
email: 'String';
|
|
20
31
|
created_at: 'Date';
|
|
32
|
+
profile: 'Map(String, String)';
|
|
33
|
+
preferences: 'Nullable(Map(LowCardinality(String), String))';
|
|
34
|
+
roles: 'Array(LowCardinality(String))';
|
|
35
|
+
is_active: 'Bool';
|
|
21
36
|
};
|
|
22
37
|
export interface TestSchema {
|
|
23
38
|
test_table: TestTableSchema;
|
|
24
39
|
users: UsersSchema;
|
|
25
40
|
}
|
|
26
41
|
export declare const TEST_SCHEMAS: TestSchema;
|
|
27
|
-
export declare function setupUsersBuilder():
|
|
28
|
-
export declare function setupTestBuilder():
|
|
42
|
+
export declare function setupUsersBuilder(): SelectQB<TestSchema, 'users', TableRecord<TestSchema['users']>, 'users'>;
|
|
43
|
+
export declare function setupTestBuilder(): SelectQB<TestSchema, 'test_table', TableRecord<TestSchema['test_table']>, 'test_table'>;
|
|
29
44
|
//# sourceMappingURL=test-utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"test-utils.d.ts","sourceRoot":"","sources":["../../../src/core/tests/test-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,SAAS,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,QAAQ,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,QAAQ,CAAC;IAEnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,qBAAqB,CAAC;IAChC,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,qCAAqC,CAAC;IAChD,aAAa,EAAE,kBAAkB,CAAC;IAClC,UAAU,EAAE,+BAA+B,CAAC;IAC5C,aAAa,EAAE,4CAA4C,CAAC;IAC5D,aAAa,EAAE,yBAAyB,CAAC;IACzC,WAAW,EAAE,4BAA4B,CAAC;IAC1C,iBAAiB,EAAE,eAAe,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,QAAQ,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IAEnB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,WAAW,EAAE,+CAA+C,CAAC;IAC7D,KAAK,EAAE,+BAA+B,CAAC;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,eAAO,MAAM,YAAY,EAAE,UAmC1B,CAAC;AAoBF,wBAAgB,iBAAiB,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,CAAC,CAU5G;AAED,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,YAAY,CAAC,CAU1H"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { QueryBuilder } from '../query-builder.js';
|
|
2
|
-
|
|
2
|
+
import { buildRuntimeContext, resolveCacheConfig } from '../cache/runtime-context.js';
|
|
3
3
|
export const TEST_SCHEMAS = {
|
|
4
4
|
test_table: {
|
|
5
5
|
id: 'Int32',
|
|
@@ -14,23 +14,50 @@ export const TEST_SCHEMAS = {
|
|
|
14
14
|
brand: 'String',
|
|
15
15
|
total: 'Int32',
|
|
16
16
|
priority: 'String',
|
|
17
|
+
is_premium: 'Bool',
|
|
18
|
+
metadata: 'Map(String, String)',
|
|
19
|
+
tags: 'Array(String)',
|
|
20
|
+
settings: 'Map(LowCardinality(String), String)',
|
|
21
|
+
optional_name: 'Nullable(String)',
|
|
22
|
+
categories: 'Array(LowCardinality(String))',
|
|
23
|
+
feature_flags: 'Array(Map(LowCardinality(String), String))',
|
|
24
|
+
optional_tags: 'Nullable(Array(String))',
|
|
25
|
+
permissions: 'Map(String, Array(String))',
|
|
26
|
+
created_timestamp: 'DateTime64(9)',
|
|
17
27
|
},
|
|
18
28
|
users: {
|
|
19
29
|
id: 'Int32',
|
|
20
30
|
user_name: 'String',
|
|
21
31
|
email: 'String',
|
|
22
|
-
created_at: 'Date'
|
|
32
|
+
created_at: 'Date',
|
|
33
|
+
profile: 'Map(String, String)',
|
|
34
|
+
preferences: 'Nullable(Map(LowCardinality(String), String))',
|
|
35
|
+
roles: 'Array(LowCardinality(String))',
|
|
36
|
+
is_active: 'Bool',
|
|
23
37
|
}
|
|
24
38
|
};
|
|
39
|
+
function createTestRuntime() {
|
|
40
|
+
return buildRuntimeContext(resolveCacheConfig(undefined, 'tests'));
|
|
41
|
+
}
|
|
25
42
|
export function setupUsersBuilder() {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
43
|
+
const state = {
|
|
44
|
+
schema: TEST_SCHEMAS,
|
|
45
|
+
tables: 'users',
|
|
46
|
+
output: {},
|
|
47
|
+
baseTable: 'users',
|
|
48
|
+
base: TEST_SCHEMAS.users,
|
|
49
|
+
aliases: {}
|
|
50
|
+
};
|
|
51
|
+
return new QueryBuilder('users', state, createTestRuntime());
|
|
30
52
|
}
|
|
31
53
|
export function setupTestBuilder() {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
54
|
+
const state = {
|
|
55
|
+
schema: TEST_SCHEMAS,
|
|
56
|
+
tables: 'test_table',
|
|
57
|
+
output: {},
|
|
58
|
+
baseTable: 'test_table',
|
|
59
|
+
base: TEST_SCHEMAS.test_table,
|
|
60
|
+
aliases: {}
|
|
61
|
+
};
|
|
62
|
+
return new QueryBuilder('test_table', state, createTestRuntime());
|
|
36
63
|
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { ColumnType, InferColumnType, TableRecord } from '../../types/schema.js';
|
|
2
|
+
import type { Simplify } from './type-helpers.js';
|
|
3
|
+
export type SchemaDefinition<Schema extends Record<string, any> = Record<string, any>> = {
|
|
4
|
+
[K in keyof Schema]: Record<string, ColumnType>;
|
|
5
|
+
};
|
|
6
|
+
export type BuilderState<Schema extends SchemaDefinition<Schema>, VisibleTables extends string, OutputRow, BaseTable extends keyof Schema, Aliases extends Partial<Record<string, keyof Schema>> = {}> = {
|
|
7
|
+
schema: Schema;
|
|
8
|
+
tables: VisibleTables;
|
|
9
|
+
output: OutputRow;
|
|
10
|
+
baseTable: BaseTable;
|
|
11
|
+
base: Schema[BaseTable];
|
|
12
|
+
aliases: Aliases;
|
|
13
|
+
};
|
|
14
|
+
export type AnyBuilderState = BuilderState<any, any, any, any, any>;
|
|
15
|
+
export type BaseRow<State extends AnyBuilderState> = Simplify<{
|
|
16
|
+
[K in keyof State['base']]: State['base'][K] extends ColumnType ? InferColumnType<State['base'][K]> : never;
|
|
17
|
+
}>;
|
|
18
|
+
export type WidenTables<State extends AnyBuilderState, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | (Table & string), State['output'], State['baseTable'], State['aliases']>;
|
|
19
|
+
export type UpdateOutput<State extends AnyBuilderState, Output> = BuilderState<State['schema'], State['tables'], Output, State['baseTable'], State['aliases']>;
|
|
20
|
+
export type InitialState<Schema extends SchemaDefinition<Schema>, Table extends keyof Schema> = BuilderState<Schema, Table & string, TableRecord<Schema[Table]>, Table, {}>;
|
|
21
|
+
export type ExplicitSelectionState<State extends AnyBuilderState> = BaseRow<State> extends State['output'] ? State['output'] extends BaseRow<State> ? false : true : true;
|
|
22
|
+
export type AppendToOutput<State extends AnyBuilderState, Added> = UpdateOutput<State, ExplicitSelectionState<State> extends true ? Simplify<State['output'] & Added> : Simplify<Added>>;
|
|
23
|
+
export type AddAlias<State extends AnyBuilderState, Alias extends string, Table extends keyof State['schema']> = BuilderState<State['schema'], State['tables'] | Alias, State['output'], State['baseTable'], State['aliases'] & Record<Alias, Table>>;
|
|
24
|
+
export type ResolveTableSchema<State extends AnyBuilderState, Table extends string> = Table extends keyof State['schema'] ? State['schema'][Table] : Table extends keyof State['aliases'] ? State['schema'][State['aliases'][Table]] : never;
|
|
25
|
+
//# sourceMappingURL=builder-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-state.d.ts","sourceRoot":"","sources":["../../../src/core/types/builder-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { SqlExpression, AliasedExpression } from '../utils/sql-expressions.js';
|
|
2
|
+
import type { ColumnType, InferColumnType } from '../../types/schema.js';
|
|
3
|
+
import type { AnyBuilderState, BaseRow, ResolveTableSchema } from './builder-state.js';
|
|
4
|
+
import { Simplify, UnionToIntersection } from './type-helpers.js';
|
|
5
|
+
type TableIdentifiers<State extends AnyBuilderState> = State['tables'] & string;
|
|
6
|
+
type QualifiedColumnsFor<State extends AnyBuilderState, Table extends string> = ResolveTableSchema<State, Table> extends Record<string, ColumnType> ? `${Table}.${Extract<keyof ResolveTableSchema<State, Table>, string>}` : never;
|
|
7
|
+
export type QualifiedColumnKeys<State extends AnyBuilderState> = {
|
|
8
|
+
[Table in TableIdentifiers<State>]: QualifiedColumnsFor<State, Table>;
|
|
9
|
+
}[TableIdentifiers<State>];
|
|
10
|
+
export type BaseColumnKeys<State extends AnyBuilderState> = keyof BaseRow<State>;
|
|
11
|
+
export type OutputColumnKeys<State extends AnyBuilderState> = keyof State['output'];
|
|
12
|
+
export type SelectableColumn<State extends AnyBuilderState> = OutputColumnKeys<State> | BaseColumnKeys<State> | QualifiedColumnKeys<State>;
|
|
13
|
+
type StringSelectableColumn<State extends AnyBuilderState> = Extract<SelectableColumn<State>, string>;
|
|
14
|
+
type AsKeyword = 'as' | 'AS' | 'As' | 'aS';
|
|
15
|
+
type AliasedColumnString<State extends AnyBuilderState> = `${StringSelectableColumn<State>} ${AsKeyword} ${string}`;
|
|
16
|
+
export type SelectableItem<State extends AnyBuilderState> = SelectableColumn<State> | AliasedColumnString<State> | SqlExpression;
|
|
17
|
+
export type ColumnSelectionKey<P> = P extends `${string}.${infer C}` ? C : P;
|
|
18
|
+
type QualifiedColumnValue<State extends AnyBuilderState, P> = P extends `${infer Table}.${infer Column}` ? ResolveTableSchema<State, Table> extends Record<string, ColumnType> ? Column extends keyof ResolveTableSchema<State, Table> ? ResolveTableSchema<State, Table>[Column] extends ColumnType ? InferColumnType<ResolveTableSchema<State, Table>[Column]> : never : never : never : never;
|
|
19
|
+
export type ColumnSelectionValue<State extends AnyBuilderState, P> = P extends OutputColumnKeys<State> ? State['output'][P] : P extends BaseColumnKeys<State> ? BaseRow<State>[P] : QualifiedColumnValue<State, P>;
|
|
20
|
+
export type ColumnSelectionRecord<State extends AnyBuilderState, K> = {
|
|
21
|
+
[P in Extract<K, SelectableColumn<State>> as ColumnSelectionKey<P>]: ColumnSelectionValue<State, P>;
|
|
22
|
+
};
|
|
23
|
+
type ParsedAliasedColumn<State extends AnyBuilderState, Entry extends string> = Entry extends `${infer Column} ${infer Keyword} ${infer Alias}` ? Lowercase<Keyword> extends 'as' ? Column extends StringSelectableColumn<State> ? {
|
|
24
|
+
[P in Alias]: ColumnSelectionValue<State, Column>;
|
|
25
|
+
} : {} : {} : {};
|
|
26
|
+
type AliasedColumnSelectionRecord<State extends AnyBuilderState, K> = [Extract<K, string>] extends [never] ? {} : UnionToIntersection<ParsedAliasedColumn<State, Extract<K, string>>>;
|
|
27
|
+
export type ExpressionSelectionRecord<K> = UnionToIntersection<K extends AliasedExpression<infer R, infer A> ? {
|
|
28
|
+
[P in A]: R;
|
|
29
|
+
} : {}>;
|
|
30
|
+
export type SelectionResult<State extends AnyBuilderState, K> = Simplify<ColumnSelectionRecord<State, K> & ExpressionSelectionRecord<K> & AliasedColumnSelectionRecord<State, K>>;
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=select-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select-types.d.ts","sourceRoot":"","sources":["../../../src/core/types/select-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-helpers.d.ts","sourceRoot":"","sources":["../../../src/core/types/type-helpers.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAC/B,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { CacheStatus } from '../cache/types.js';
|
|
1
2
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
2
3
|
export interface QueryLog {
|
|
3
4
|
query: string;
|
|
@@ -9,6 +10,11 @@ export interface QueryLog {
|
|
|
9
10
|
error?: Error;
|
|
10
11
|
rowCount?: number;
|
|
11
12
|
queryId?: string;
|
|
13
|
+
cacheStatus?: CacheStatus;
|
|
14
|
+
cacheKey?: string;
|
|
15
|
+
cacheMode?: string;
|
|
16
|
+
cacheAgeMs?: number;
|
|
17
|
+
cacheRowCount?: number;
|
|
12
18
|
}
|
|
13
19
|
export interface LoggerOptions {
|
|
14
20
|
level?: LogLevel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/core/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;IAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,CAAC;CACtC;AAED,cAAM,MAAM;IACV,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAC,CAA0B;IAC7C,OAAO,CAAC,gBAAgB,CAAuD;IAE/E,OAAO;IAEP,MAAM,CAAC,WAAW,IAAI,MAAM;IAO5B,SAAS,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAMvC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,QAAQ,KAAK,IAAI,GAAG,MAAM,IAAI;IAoBhF,OAAO,CAAC,SAAS;IAMjB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM3C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAM5C,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI;CAwC9B;AAED,eAAO,MAAM,MAAM,QAAuB,CAAC"}
|
|
@@ -75,13 +75,18 @@ class Logger {
|
|
|
75
75
|
subscribers.forEach(callback => callback(log));
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
-
const { query, parameters, duration, status, error, rowCount } = log;
|
|
78
|
+
const { query, parameters, duration, status, error, rowCount, cacheStatus, cacheKey, cacheMode, cacheAgeMs, cacheRowCount } = log;
|
|
79
79
|
const message = `Query ${status}: ${query}`;
|
|
80
80
|
const details = {
|
|
81
81
|
parameters,
|
|
82
82
|
duration: duration ? `${duration}ms` : undefined,
|
|
83
83
|
rowCount,
|
|
84
|
-
error: error?.message
|
|
84
|
+
error: error?.message,
|
|
85
|
+
cacheStatus,
|
|
86
|
+
cacheKey,
|
|
87
|
+
cacheMode,
|
|
88
|
+
cacheAgeMs,
|
|
89
|
+
cacheRowCount
|
|
85
90
|
};
|
|
86
91
|
switch (status) {
|
|
87
92
|
case 'started':
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AnyBuilderState, BaseRow } from '../types/builder-state.js';
|
|
2
|
+
import type { SelectableColumn } from '../types/select-types.js';
|
|
3
|
+
export type PredicatePrimitive = string | number | boolean | Date | null;
|
|
4
|
+
type PredicateValue = Exclude<PredicatePrimitive, string>;
|
|
5
|
+
export interface PredicateExpression<T = unknown> {
|
|
6
|
+
__type: 'predicate_expression';
|
|
7
|
+
sql: string;
|
|
8
|
+
parameters: any[];
|
|
9
|
+
readonly expressionType?: T | undefined;
|
|
10
|
+
}
|
|
11
|
+
export interface PredicateLiteral<T = PredicatePrimitive> {
|
|
12
|
+
__type: 'predicate_literal';
|
|
13
|
+
value: T;
|
|
14
|
+
}
|
|
15
|
+
export type ColumnReference<State extends AnyBuilderState> = keyof BaseRow<State> | keyof State['output'] | Extract<SelectableColumn<State>, string>;
|
|
16
|
+
export type PredicateArg<State extends AnyBuilderState> = ColumnReference<State> | PredicateExpression | PredicateLiteral | PredicateValue | PredicatePrimitive[];
|
|
17
|
+
export interface PredicateBuilder<State extends AnyBuilderState> {
|
|
18
|
+
fn<T = unknown>(name: string, ...args: Array<PredicateArg<State>>): PredicateExpression<T>;
|
|
19
|
+
col(column: ColumnReference<State>): PredicateExpression;
|
|
20
|
+
value<T extends PredicatePrimitive>(value: T): PredicateLiteral<T>;
|
|
21
|
+
literal<T extends PredicatePrimitive>(value: T): PredicateLiteral<T>;
|
|
22
|
+
array(values: Array<PredicatePrimitive | PredicateLiteral>): PredicateExpression;
|
|
23
|
+
raw(sql: string): PredicateExpression;
|
|
24
|
+
and(expressions: PredicateExpression[]): PredicateExpression<boolean>;
|
|
25
|
+
or(expressions: PredicateExpression[]): PredicateExpression<boolean>;
|
|
26
|
+
}
|
|
27
|
+
export declare function createPredicateBuilder<State extends AnyBuilderState>(): PredicateBuilder<State>;
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=predicate-builder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"predicate-builder.d.ts","sourceRoot":"","sources":["../../../src/core/utils/predicate-builder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC;AACzE,KAAK,cAAc,GAAG,OAAO,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAE1D,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,MAAM,EAAE,sBAAsB,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;CACzC;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,kBAAkB;IACtD,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,CAAC,CAAC;CACV;AAED,MAAM,MAAM,eAAe,CAAC,KAAK,SAAS,eAAe,IACrD,MAAM,OAAO,CAAC,KAAK,CAAC,GACpB,MAAM,KAAK,CAAC,QAAQ,CAAC,GACrB,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;AAE7C,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,eAAe,IAClD,eAAe,CAAC,KAAK,CAAC,GACtB,mBAAmB,GACnB,gBAAgB,GAChB,cAAc,GACd,kBAAkB,EAAE,CAAC;AAEzB,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,eAAe;IAC7D,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,mBAAmB,CAAC;IACzD,KAAK,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACnE,OAAO,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC;IACrE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,kBAAkB,GAAG,gBAAgB,CAAC,GAAG,mBAAmB,CAAC;IACjF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACtC,GAAG,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACtE,EAAE,CAAC,WAAW,EAAE,mBAAmB,EAAE,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;CACtE;AA4GD,wBAAgB,sBAAsB,CAAC,KAAK,SAAS,eAAe,KAAK,gBAAgB,CAAC,KAAK,CAAC,CAY/F"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
function createExpression(sql, parameters = []) {
|
|
2
|
+
return {
|
|
3
|
+
__type: 'predicate_expression',
|
|
4
|
+
sql,
|
|
5
|
+
parameters,
|
|
6
|
+
expressionType: undefined
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
function literal(value) {
|
|
10
|
+
return {
|
|
11
|
+
__type: 'predicate_literal',
|
|
12
|
+
value
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
function isPredicateExpression(value) {
|
|
16
|
+
return value?.__type === 'predicate_expression';
|
|
17
|
+
}
|
|
18
|
+
function isPredicateLiteral(value) {
|
|
19
|
+
return value?.__type === 'predicate_literal';
|
|
20
|
+
}
|
|
21
|
+
function buildArrayLiteral(values) {
|
|
22
|
+
const parts = [];
|
|
23
|
+
const parameters = [];
|
|
24
|
+
values.forEach(value => {
|
|
25
|
+
const normalized = normalizeLiteralValue(value);
|
|
26
|
+
parts.push(normalized.sql);
|
|
27
|
+
parameters.push(...normalized.parameters);
|
|
28
|
+
});
|
|
29
|
+
return createExpression(`[${parts.join(', ')}]`, parameters);
|
|
30
|
+
}
|
|
31
|
+
function normalizeLiteralValue(value) {
|
|
32
|
+
if (isPredicateLiteral(value)) {
|
|
33
|
+
return createExpression('?', [value.value]);
|
|
34
|
+
}
|
|
35
|
+
if (value === null) {
|
|
36
|
+
return createExpression('NULL');
|
|
37
|
+
}
|
|
38
|
+
if (value instanceof Date || typeof value === 'number' || typeof value === 'boolean' || typeof value === 'string') {
|
|
39
|
+
return createExpression('?', [value]);
|
|
40
|
+
}
|
|
41
|
+
throw new Error('Unsupported literal value in predicate array');
|
|
42
|
+
}
|
|
43
|
+
function normalizeArgument(arg) {
|
|
44
|
+
if (isPredicateExpression(arg)) {
|
|
45
|
+
return arg;
|
|
46
|
+
}
|
|
47
|
+
if (isPredicateLiteral(arg)) {
|
|
48
|
+
return createExpression('?', [arg.value]);
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(arg)) {
|
|
51
|
+
return buildArrayLiteral(arg);
|
|
52
|
+
}
|
|
53
|
+
if (arg === null) {
|
|
54
|
+
return createExpression('NULL');
|
|
55
|
+
}
|
|
56
|
+
if (arg instanceof Date || typeof arg === 'number' || typeof arg === 'boolean') {
|
|
57
|
+
return createExpression('?', [arg]);
|
|
58
|
+
}
|
|
59
|
+
if (typeof arg === 'string') {
|
|
60
|
+
return createExpression(arg);
|
|
61
|
+
}
|
|
62
|
+
throw new Error('Unsupported predicate argument type');
|
|
63
|
+
}
|
|
64
|
+
function buildFunctionExpression(name, args) {
|
|
65
|
+
const builtArgs = args.map(arg => normalizeArgument(arg));
|
|
66
|
+
const sql = `${name}(${builtArgs.map(arg => arg.sql).join(', ')})`;
|
|
67
|
+
const parameters = builtArgs.flatMap(arg => arg.parameters);
|
|
68
|
+
return createExpression(sql, parameters);
|
|
69
|
+
}
|
|
70
|
+
function buildLogical(operator, expressions) {
|
|
71
|
+
if (!expressions.length) {
|
|
72
|
+
throw new Error(`${operator} requires at least one expression`);
|
|
73
|
+
}
|
|
74
|
+
if (expressions.length === 1) {
|
|
75
|
+
return expressions[0];
|
|
76
|
+
}
|
|
77
|
+
const sql = expressions.map(expr => `(${expr.sql})`).join(` ${operator} `);
|
|
78
|
+
const parameters = expressions.flatMap(expr => expr.parameters);
|
|
79
|
+
return createExpression(sql, parameters);
|
|
80
|
+
}
|
|
81
|
+
export function createPredicateBuilder() {
|
|
82
|
+
return {
|
|
83
|
+
fn: (name, ...args) => buildFunctionExpression(name, args),
|
|
84
|
+
col: column => createExpression(String(column)),
|
|
85
|
+
value: value => literal(value),
|
|
86
|
+
literal: value => literal(value),
|
|
87
|
+
array: values => buildArrayLiteral(values),
|
|
88
|
+
raw: sql => createExpression(sql),
|
|
89
|
+
and: expressions => buildLogical('AND', expressions),
|
|
90
|
+
or: expressions => buildLogical('OR', expressions)
|
|
91
|
+
};
|
|
92
|
+
}
|