relq 1.0.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/LICENSE +21 -0
- package/README.md +862 -0
- package/dist/addons/buffer.js +1869 -0
- package/dist/addons/pg-cursor.js +1425 -0
- package/dist/addons/pg-format.js +2248 -0
- package/dist/addons/pg.js +4790 -0
- package/dist/bin/relq.js +2 -0
- package/dist/cjs/cache/index.cjs +9 -0
- package/dist/cjs/cache/query-cache.cjs +311 -0
- package/dist/cjs/cli/commands/add.cjs +82 -0
- package/dist/cjs/cli/commands/commit.cjs +145 -0
- package/dist/cjs/cli/commands/diff.cjs +84 -0
- package/dist/cjs/cli/commands/export.cjs +333 -0
- package/dist/cjs/cli/commands/fetch.cjs +59 -0
- package/dist/cjs/cli/commands/generate.cjs +242 -0
- package/dist/cjs/cli/commands/history.cjs +165 -0
- package/dist/cjs/cli/commands/import.cjs +524 -0
- package/dist/cjs/cli/commands/init.cjs +437 -0
- package/dist/cjs/cli/commands/introspect.cjs +142 -0
- package/dist/cjs/cli/commands/log.cjs +62 -0
- package/dist/cjs/cli/commands/migrate.cjs +167 -0
- package/dist/cjs/cli/commands/pull.cjs +410 -0
- package/dist/cjs/cli/commands/push.cjs +165 -0
- package/dist/cjs/cli/commands/rollback.cjs +169 -0
- package/dist/cjs/cli/commands/status.cjs +110 -0
- package/dist/cjs/cli/commands/sync.cjs +79 -0
- package/dist/cjs/cli/index.cjs +275 -0
- package/dist/cjs/cli/utils/change-tracker.cjs +446 -0
- package/dist/cjs/cli/utils/commit-manager.cjs +239 -0
- package/dist/cjs/cli/utils/config-loader.cjs +127 -0
- package/dist/cjs/cli/utils/env-loader.cjs +62 -0
- package/dist/cjs/cli/utils/fast-introspect.cjs +398 -0
- package/dist/cjs/cli/utils/git-utils.cjs +404 -0
- package/dist/cjs/cli/utils/migration-generator.cjs +269 -0
- package/dist/cjs/cli/utils/relqignore.cjs +114 -0
- package/dist/cjs/cli/utils/repo-manager.cjs +515 -0
- package/dist/cjs/cli/utils/schema-comparator.cjs +313 -0
- package/dist/cjs/cli/utils/schema-diff.cjs +284 -0
- package/dist/cjs/cli/utils/schema-hash.cjs +108 -0
- package/dist/cjs/cli/utils/schema-introspect.cjs +455 -0
- package/dist/cjs/cli/utils/snapshot-manager.cjs +223 -0
- package/dist/cjs/cli/utils/spinner.cjs +108 -0
- package/dist/cjs/cli/utils/sql-generator.cjs +520 -0
- package/dist/cjs/cli/utils/sql-parser.cjs +999 -0
- package/dist/cjs/cli/utils/type-generator.cjs +2061 -0
- package/dist/cjs/condition/array-condition-builder.cjs +503 -0
- package/dist/cjs/condition/array-numeric-condition-builder.cjs +186 -0
- package/dist/cjs/condition/array-specialized-condition-builder.cjs +206 -0
- package/dist/cjs/condition/array-string-condition-builder.cjs +146 -0
- package/dist/cjs/condition/base-condition-builder.cjs +2 -0
- package/dist/cjs/condition/condition-collector.cjs +284 -0
- package/dist/cjs/condition/fulltext-condition-builder.cjs +61 -0
- package/dist/cjs/condition/geometric-condition-builder.cjs +208 -0
- package/dist/cjs/condition/index.cjs +25 -0
- package/dist/cjs/condition/jsonb-condition-builder.cjs +160 -0
- package/dist/cjs/condition/network-condition-builder.cjs +230 -0
- package/dist/cjs/condition/range-condition-builder.cjs +82 -0
- package/dist/cjs/config/config.cjs +190 -0
- package/dist/cjs/config/index.cjs +9 -0
- package/dist/cjs/constants/pg-values.cjs +68 -0
- package/dist/cjs/copy/copy-builder.cjs +316 -0
- package/dist/cjs/copy/index.cjs +6 -0
- package/dist/cjs/core/query-builder.cjs +440 -0
- package/dist/cjs/core/relq-client.cjs +1831 -0
- package/dist/cjs/core/typed-kuery-client.cjs +2 -0
- package/dist/cjs/count/count-builder.cjs +88 -0
- package/dist/cjs/count/index.cjs +5 -0
- package/dist/cjs/cte/cte-builder.cjs +89 -0
- package/dist/cjs/cte/index.cjs +5 -0
- package/dist/cjs/ddl/function.cjs +48 -0
- package/dist/cjs/ddl/index.cjs +7 -0
- package/dist/cjs/ddl/sql.cjs +54 -0
- package/dist/cjs/delete/delete-builder.cjs +135 -0
- package/dist/cjs/delete/index.cjs +5 -0
- package/dist/cjs/errors/relq-errors.cjs +329 -0
- package/dist/cjs/examples/fulltext-search-test.cjs +122 -0
- package/dist/cjs/explain/explain-builder.cjs +99 -0
- package/dist/cjs/explain/index.cjs +5 -0
- package/dist/cjs/function/create-function-builder.cjs +196 -0
- package/dist/cjs/function/index.cjs +6 -0
- package/dist/cjs/functions/advanced-functions.cjs +241 -0
- package/dist/cjs/functions/case-builder.cjs +66 -0
- package/dist/cjs/functions/geometric-functions.cjs +104 -0
- package/dist/cjs/functions/index.cjs +184 -0
- package/dist/cjs/functions/network-functions.cjs +86 -0
- package/dist/cjs/functions/sql-functions.cjs +431 -0
- package/dist/cjs/index.cjs +164 -0
- package/dist/cjs/indexing/create-index-builder.cjs +187 -0
- package/dist/cjs/indexing/drop-index-builder.cjs +89 -0
- package/dist/cjs/indexing/index-types.cjs +2 -0
- package/dist/cjs/indexing/index.cjs +8 -0
- package/dist/cjs/insert/conflict-builder.cjs +173 -0
- package/dist/cjs/insert/index.cjs +5 -0
- package/dist/cjs/insert/insert-builder.cjs +254 -0
- package/dist/cjs/introspect/index.cjs +229 -0
- package/dist/cjs/maintenance/index.cjs +6 -0
- package/dist/cjs/maintenance/vacuum-builder.cjs +166 -0
- package/dist/cjs/pubsub/index.cjs +7 -0
- package/dist/cjs/pubsub/listen-notify-builder.cjs +57 -0
- package/dist/cjs/pubsub/listener-connection.cjs +180 -0
- package/dist/cjs/raw/index.cjs +5 -0
- package/dist/cjs/raw/raw-query-builder.cjs +27 -0
- package/dist/cjs/schema/index.cjs +15 -0
- package/dist/cjs/schema/schema-builder.cjs +1167 -0
- package/dist/cjs/schema-builder.cjs +21 -0
- package/dist/cjs/schema-definition/column-types.cjs +829 -0
- package/dist/cjs/schema-definition/index.cjs +62 -0
- package/dist/cjs/schema-definition/introspection.cjs +620 -0
- package/dist/cjs/schema-definition/partitions.cjs +129 -0
- package/dist/cjs/schema-definition/pg-enum.cjs +76 -0
- package/dist/cjs/schema-definition/pg-function.cjs +91 -0
- package/dist/cjs/schema-definition/pg-sequence.cjs +56 -0
- package/dist/cjs/schema-definition/pg-trigger.cjs +108 -0
- package/dist/cjs/schema-definition/relations.cjs +98 -0
- package/dist/cjs/schema-definition/sql-expressions.cjs +202 -0
- package/dist/cjs/schema-definition/table-definition.cjs +636 -0
- package/dist/cjs/select/aggregate-builder.cjs +179 -0
- package/dist/cjs/select/index.cjs +5 -0
- package/dist/cjs/select/select-builder.cjs +233 -0
- package/dist/cjs/sequence/index.cjs +7 -0
- package/dist/cjs/sequence/sequence-builder.cjs +264 -0
- package/dist/cjs/table/alter-table-builder.cjs +146 -0
- package/dist/cjs/table/constraint-builder.cjs +102 -0
- package/dist/cjs/table/create-table-builder.cjs +248 -0
- package/dist/cjs/table/index.cjs +17 -0
- package/dist/cjs/table/partition-builder.cjs +131 -0
- package/dist/cjs/table/truncate-builder.cjs +70 -0
- package/dist/cjs/transaction/index.cjs +6 -0
- package/dist/cjs/transaction/transaction-builder.cjs +78 -0
- package/dist/cjs/trigger/create-trigger-builder.cjs +174 -0
- package/dist/cjs/trigger/index.cjs +6 -0
- package/dist/cjs/types/aggregate-types.cjs +2 -0
- package/dist/cjs/types/config-types.cjs +40 -0
- package/dist/cjs/types/inference-types.cjs +18 -0
- package/dist/cjs/types/pagination-types.cjs +7 -0
- package/dist/cjs/types/result-types.cjs +2 -0
- package/dist/cjs/types/schema-types.cjs +2 -0
- package/dist/cjs/types/subscription-types.cjs +2 -0
- package/dist/cjs/types.cjs +2 -0
- package/dist/cjs/update/array-update-builder.cjs +205 -0
- package/dist/cjs/update/index.cjs +13 -0
- package/dist/cjs/update/update-builder.cjs +195 -0
- package/dist/cjs/utils/case-converter.cjs +58 -0
- package/dist/cjs/utils/environment-detection.cjs +120 -0
- package/dist/cjs/utils/index.cjs +10 -0
- package/dist/cjs/utils/pool-defaults.cjs +106 -0
- package/dist/cjs/utils/type-coercion.cjs +118 -0
- package/dist/cjs/view/create-view-builder.cjs +180 -0
- package/dist/cjs/view/index.cjs +7 -0
- package/dist/cjs/window/index.cjs +5 -0
- package/dist/cjs/window/window-builder.cjs +80 -0
- package/dist/config.cjs +1 -0
- package/dist/config.d.ts +655 -0
- package/dist/config.js +1 -0
- package/dist/esm/cache/index.js +1 -0
- package/dist/esm/cache/query-cache.js +303 -0
- package/dist/esm/cli/commands/add.js +78 -0
- package/dist/esm/cli/commands/commit.js +109 -0
- package/dist/esm/cli/commands/diff.js +81 -0
- package/dist/esm/cli/commands/export.js +297 -0
- package/dist/esm/cli/commands/fetch.js +56 -0
- package/dist/esm/cli/commands/generate.js +206 -0
- package/dist/esm/cli/commands/history.js +129 -0
- package/dist/esm/cli/commands/import.js +488 -0
- package/dist/esm/cli/commands/init.js +401 -0
- package/dist/esm/cli/commands/introspect.js +106 -0
- package/dist/esm/cli/commands/log.js +59 -0
- package/dist/esm/cli/commands/migrate.js +131 -0
- package/dist/esm/cli/commands/pull.js +374 -0
- package/dist/esm/cli/commands/push.js +129 -0
- package/dist/esm/cli/commands/rollback.js +133 -0
- package/dist/esm/cli/commands/status.js +107 -0
- package/dist/esm/cli/commands/sync.js +76 -0
- package/dist/esm/cli/index.js +240 -0
- package/dist/esm/cli/utils/change-tracker.js +405 -0
- package/dist/esm/cli/utils/commit-manager.js +191 -0
- package/dist/esm/cli/utils/config-loader.js +86 -0
- package/dist/esm/cli/utils/env-loader.js +57 -0
- package/dist/esm/cli/utils/fast-introspect.js +362 -0
- package/dist/esm/cli/utils/git-utils.js +347 -0
- package/dist/esm/cli/utils/migration-generator.js +263 -0
- package/dist/esm/cli/utils/relqignore.js +74 -0
- package/dist/esm/cli/utils/repo-manager.js +444 -0
- package/dist/esm/cli/utils/schema-comparator.js +307 -0
- package/dist/esm/cli/utils/schema-diff.js +276 -0
- package/dist/esm/cli/utils/schema-hash.js +69 -0
- package/dist/esm/cli/utils/schema-introspect.js +418 -0
- package/dist/esm/cli/utils/snapshot-manager.js +179 -0
- package/dist/esm/cli/utils/spinner.js +101 -0
- package/dist/esm/cli/utils/sql-generator.js +504 -0
- package/dist/esm/cli/utils/sql-parser.js +992 -0
- package/dist/esm/cli/utils/type-generator.js +2058 -0
- package/dist/esm/condition/array-condition-builder.js +495 -0
- package/dist/esm/condition/array-numeric-condition-builder.js +182 -0
- package/dist/esm/condition/array-specialized-condition-builder.js +200 -0
- package/dist/esm/condition/array-string-condition-builder.js +142 -0
- package/dist/esm/condition/base-condition-builder.js +1 -0
- package/dist/esm/condition/condition-collector.js +275 -0
- package/dist/esm/condition/fulltext-condition-builder.js +53 -0
- package/dist/esm/condition/geometric-condition-builder.js +200 -0
- package/dist/esm/condition/index.js +7 -0
- package/dist/esm/condition/jsonb-condition-builder.js +152 -0
- package/dist/esm/condition/network-condition-builder.js +222 -0
- package/dist/esm/condition/range-condition-builder.js +74 -0
- package/dist/esm/config/config.js +150 -0
- package/dist/esm/config/index.js +1 -0
- package/dist/esm/constants/pg-values.js +63 -0
- package/dist/esm/copy/copy-builder.js +308 -0
- package/dist/esm/copy/index.js +1 -0
- package/dist/esm/core/query-builder.js +426 -0
- package/dist/esm/core/relq-client.js +1791 -0
- package/dist/esm/core/typed-kuery-client.js +1 -0
- package/dist/esm/count/count-builder.js +81 -0
- package/dist/esm/count/index.js +1 -0
- package/dist/esm/cte/cte-builder.js +82 -0
- package/dist/esm/cte/index.js +1 -0
- package/dist/esm/ddl/function.js +45 -0
- package/dist/esm/ddl/index.js +2 -0
- package/dist/esm/ddl/sql.js +51 -0
- package/dist/esm/delete/delete-builder.js +128 -0
- package/dist/esm/delete/index.js +1 -0
- package/dist/esm/errors/relq-errors.js +310 -0
- package/dist/esm/examples/fulltext-search-test.js +117 -0
- package/dist/esm/explain/explain-builder.js +95 -0
- package/dist/esm/explain/index.js +1 -0
- package/dist/esm/function/create-function-builder.js +188 -0
- package/dist/esm/function/index.js +1 -0
- package/dist/esm/functions/advanced-functions.js +231 -0
- package/dist/esm/functions/case-builder.js +58 -0
- package/dist/esm/functions/geometric-functions.js +97 -0
- package/dist/esm/functions/index.js +171 -0
- package/dist/esm/functions/network-functions.js +79 -0
- package/dist/esm/functions/sql-functions.js +421 -0
- package/dist/esm/index.js +34 -0
- package/dist/esm/indexing/create-index-builder.js +180 -0
- package/dist/esm/indexing/drop-index-builder.js +81 -0
- package/dist/esm/indexing/index-types.js +1 -0
- package/dist/esm/indexing/index.js +2 -0
- package/dist/esm/insert/conflict-builder.js +162 -0
- package/dist/esm/insert/index.js +1 -0
- package/dist/esm/insert/insert-builder.js +247 -0
- package/dist/esm/introspect/index.js +224 -0
- package/dist/esm/maintenance/index.js +1 -0
- package/dist/esm/maintenance/vacuum-builder.js +158 -0
- package/dist/esm/pubsub/index.js +1 -0
- package/dist/esm/pubsub/listen-notify-builder.js +48 -0
- package/dist/esm/pubsub/listener-connection.js +173 -0
- package/dist/esm/raw/index.js +1 -0
- package/dist/esm/raw/raw-query-builder.js +20 -0
- package/dist/esm/schema/index.js +1 -0
- package/dist/esm/schema/schema-builder.js +1150 -0
- package/dist/esm/schema-builder.js +2 -0
- package/dist/esm/schema-definition/column-types.js +738 -0
- package/dist/esm/schema-definition/index.js +10 -0
- package/dist/esm/schema-definition/introspection.js +614 -0
- package/dist/esm/schema-definition/partitions.js +123 -0
- package/dist/esm/schema-definition/pg-enum.js +70 -0
- package/dist/esm/schema-definition/pg-function.js +85 -0
- package/dist/esm/schema-definition/pg-sequence.js +50 -0
- package/dist/esm/schema-definition/pg-trigger.js +102 -0
- package/dist/esm/schema-definition/relations.js +90 -0
- package/dist/esm/schema-definition/sql-expressions.js +193 -0
- package/dist/esm/schema-definition/table-definition.js +630 -0
- package/dist/esm/select/aggregate-builder.js +172 -0
- package/dist/esm/select/index.js +1 -0
- package/dist/esm/select/select-builder.js +226 -0
- package/dist/esm/sequence/index.js +1 -0
- package/dist/esm/sequence/sequence-builder.js +255 -0
- package/dist/esm/table/alter-table-builder.js +138 -0
- package/dist/esm/table/constraint-builder.js +95 -0
- package/dist/esm/table/create-table-builder.js +241 -0
- package/dist/esm/table/index.js +5 -0
- package/dist/esm/table/partition-builder.js +121 -0
- package/dist/esm/table/truncate-builder.js +63 -0
- package/dist/esm/transaction/index.js +1 -0
- package/dist/esm/transaction/transaction-builder.js +70 -0
- package/dist/esm/trigger/create-trigger-builder.js +166 -0
- package/dist/esm/trigger/index.js +1 -0
- package/dist/esm/types/aggregate-types.js +1 -0
- package/dist/esm/types/config-types.js +36 -0
- package/dist/esm/types/inference-types.js +12 -0
- package/dist/esm/types/pagination-types.js +4 -0
- package/dist/esm/types/result-types.js +1 -0
- package/dist/esm/types/schema-types.js +1 -0
- package/dist/esm/types/subscription-types.js +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/update/array-update-builder.js +192 -0
- package/dist/esm/update/index.js +2 -0
- package/dist/esm/update/update-builder.js +188 -0
- package/dist/esm/utils/case-converter.js +55 -0
- package/dist/esm/utils/environment-detection.js +113 -0
- package/dist/esm/utils/index.js +2 -0
- package/dist/esm/utils/pool-defaults.js +100 -0
- package/dist/esm/utils/type-coercion.js +110 -0
- package/dist/esm/view/create-view-builder.js +171 -0
- package/dist/esm/view/index.js +1 -0
- package/dist/esm/window/index.js +1 -0
- package/dist/esm/window/window-builder.js +73 -0
- package/dist/index.cjs +1 -0
- package/dist/index.d.ts +10341 -0
- package/dist/index.js +1 -0
- package/dist/schema-builder.cjs +1 -0
- package/dist/schema-builder.d.ts +2272 -0
- package/dist/schema-builder.js +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,495 @@
|
|
|
1
|
+
import format from "../../addons/pg-format.js";
|
|
2
|
+
import { ArrayStringConditionBuilder } from "./array-string-condition-builder.js";
|
|
3
|
+
import { ArrayNumericConditionBuilder } from "./array-numeric-condition-builder.js";
|
|
4
|
+
import { ArrayUuidConditionBuilder, ArrayDateConditionBuilder, ArrayJsonbConditionBuilder } from "./array-specialized-condition-builder.js";
|
|
5
|
+
export class ArrayConditionCollector {
|
|
6
|
+
parent;
|
|
7
|
+
string;
|
|
8
|
+
numeric;
|
|
9
|
+
integer;
|
|
10
|
+
uuid;
|
|
11
|
+
date;
|
|
12
|
+
timestamp;
|
|
13
|
+
jsonb;
|
|
14
|
+
constructor(parent) {
|
|
15
|
+
this.parent = parent;
|
|
16
|
+
this.string = new ArrayStringConditionBuilder(parent);
|
|
17
|
+
this.numeric = new ArrayNumericConditionBuilder(parent);
|
|
18
|
+
this.integer = this.numeric;
|
|
19
|
+
this.uuid = new ArrayUuidConditionBuilder(parent);
|
|
20
|
+
this.date = new ArrayDateConditionBuilder(parent);
|
|
21
|
+
this.timestamp = this.date;
|
|
22
|
+
this.jsonb = new ArrayJsonbConditionBuilder(parent);
|
|
23
|
+
}
|
|
24
|
+
contains(column, values) {
|
|
25
|
+
this.parent.conditions.push({
|
|
26
|
+
method: 'array_contains',
|
|
27
|
+
column,
|
|
28
|
+
values
|
|
29
|
+
});
|
|
30
|
+
return this.parent;
|
|
31
|
+
}
|
|
32
|
+
containedBy(column, values) {
|
|
33
|
+
this.parent.conditions.push({
|
|
34
|
+
method: 'array_contained_by',
|
|
35
|
+
column,
|
|
36
|
+
values
|
|
37
|
+
});
|
|
38
|
+
return this.parent;
|
|
39
|
+
}
|
|
40
|
+
overlaps(column, values) {
|
|
41
|
+
this.parent.conditions.push({
|
|
42
|
+
method: 'array_overlaps',
|
|
43
|
+
column,
|
|
44
|
+
values
|
|
45
|
+
});
|
|
46
|
+
return this.parent;
|
|
47
|
+
}
|
|
48
|
+
equal(column, values) {
|
|
49
|
+
this.parent.conditions.push({
|
|
50
|
+
method: 'array_equal',
|
|
51
|
+
column,
|
|
52
|
+
values
|
|
53
|
+
});
|
|
54
|
+
return this.parent;
|
|
55
|
+
}
|
|
56
|
+
notEqual(column, values) {
|
|
57
|
+
this.parent.conditions.push({
|
|
58
|
+
method: 'array_not_equal',
|
|
59
|
+
column,
|
|
60
|
+
values
|
|
61
|
+
});
|
|
62
|
+
return this.parent;
|
|
63
|
+
}
|
|
64
|
+
any(column, operator, value) {
|
|
65
|
+
this.parent.conditions.push({
|
|
66
|
+
method: 'array_any',
|
|
67
|
+
column,
|
|
68
|
+
values: { operator, value }
|
|
69
|
+
});
|
|
70
|
+
return this.parent;
|
|
71
|
+
}
|
|
72
|
+
all(column, operator, value) {
|
|
73
|
+
this.parent.conditions.push({
|
|
74
|
+
method: 'array_all',
|
|
75
|
+
column,
|
|
76
|
+
values: { operator, value }
|
|
77
|
+
});
|
|
78
|
+
return this.parent;
|
|
79
|
+
}
|
|
80
|
+
length(column, length) {
|
|
81
|
+
this.parent.conditions.push({
|
|
82
|
+
method: 'array_length',
|
|
83
|
+
column,
|
|
84
|
+
values: length
|
|
85
|
+
});
|
|
86
|
+
return this.parent;
|
|
87
|
+
}
|
|
88
|
+
containsPattern(column, pattern, matchType = 'prefix') {
|
|
89
|
+
this.parent.conditions.push({
|
|
90
|
+
method: 'array_contains_pattern',
|
|
91
|
+
column,
|
|
92
|
+
values: { pattern, matchType }
|
|
93
|
+
});
|
|
94
|
+
return this.parent;
|
|
95
|
+
}
|
|
96
|
+
containsPrefix(column, prefix) {
|
|
97
|
+
return this.containsPattern(column, prefix, 'prefix');
|
|
98
|
+
}
|
|
99
|
+
containsSuffix(column, suffix) {
|
|
100
|
+
return this.containsPattern(column, suffix, 'suffix');
|
|
101
|
+
}
|
|
102
|
+
containsSubstring(column, substring) {
|
|
103
|
+
return this.containsPattern(column, substring, 'contains');
|
|
104
|
+
}
|
|
105
|
+
append(column, value) {
|
|
106
|
+
this.parent.conditions.push({
|
|
107
|
+
method: 'array_append_value',
|
|
108
|
+
column,
|
|
109
|
+
values: value
|
|
110
|
+
});
|
|
111
|
+
return this.parent;
|
|
112
|
+
}
|
|
113
|
+
prepend(column, value) {
|
|
114
|
+
this.parent.conditions.push({
|
|
115
|
+
method: 'array_prepend_value',
|
|
116
|
+
column,
|
|
117
|
+
values: value
|
|
118
|
+
});
|
|
119
|
+
return this.parent;
|
|
120
|
+
}
|
|
121
|
+
remove(column, value) {
|
|
122
|
+
this.parent.conditions.push({
|
|
123
|
+
method: 'array_remove_value',
|
|
124
|
+
column,
|
|
125
|
+
values: value
|
|
126
|
+
});
|
|
127
|
+
return this.parent;
|
|
128
|
+
}
|
|
129
|
+
removePattern(column, pattern, matchType = 'prefix') {
|
|
130
|
+
this.parent.conditions.push({
|
|
131
|
+
method: 'array_remove_pattern',
|
|
132
|
+
column,
|
|
133
|
+
values: { pattern, matchType }
|
|
134
|
+
});
|
|
135
|
+
return this.parent;
|
|
136
|
+
}
|
|
137
|
+
removePrefix(column, prefix) {
|
|
138
|
+
return this.removePattern(column, prefix, 'prefix');
|
|
139
|
+
}
|
|
140
|
+
removeSuffix(column, suffix) {
|
|
141
|
+
return this.removePattern(column, suffix, 'suffix');
|
|
142
|
+
}
|
|
143
|
+
removeSubstring(column, substring) {
|
|
144
|
+
return this.removePattern(column, substring, 'contains');
|
|
145
|
+
}
|
|
146
|
+
updatePattern(column, pattern, replacement, matchType = 'prefix') {
|
|
147
|
+
this.parent.conditions.push({
|
|
148
|
+
method: 'array_update_pattern',
|
|
149
|
+
column,
|
|
150
|
+
values: { pattern, replacement, matchType }
|
|
151
|
+
});
|
|
152
|
+
return this.parent;
|
|
153
|
+
}
|
|
154
|
+
updatePrefix(column, prefix, replacement) {
|
|
155
|
+
return this.updatePattern(column, prefix, replacement, 'prefix');
|
|
156
|
+
}
|
|
157
|
+
updateSuffix(column, suffix, replacement) {
|
|
158
|
+
return this.updatePattern(column, suffix, replacement, 'suffix');
|
|
159
|
+
}
|
|
160
|
+
updateSubstring(column, substring, replacement) {
|
|
161
|
+
return this.updatePattern(column, substring, replacement, 'contains');
|
|
162
|
+
}
|
|
163
|
+
hasNonMatching(column, pattern, matchType = 'prefix') {
|
|
164
|
+
this.parent.conditions.push({
|
|
165
|
+
method: 'array_has_non_matching',
|
|
166
|
+
column,
|
|
167
|
+
values: { pattern, matchType }
|
|
168
|
+
});
|
|
169
|
+
return this.parent;
|
|
170
|
+
}
|
|
171
|
+
hasNonMatchingPrefix(column, prefix) {
|
|
172
|
+
return this.hasNonMatching(column, prefix, 'prefix');
|
|
173
|
+
}
|
|
174
|
+
hasNonMatchingSuffix(column, suffix) {
|
|
175
|
+
return this.hasNonMatching(column, suffix, 'suffix');
|
|
176
|
+
}
|
|
177
|
+
allMatch(column, pattern, matchType = 'prefix') {
|
|
178
|
+
this.parent.conditions.push({
|
|
179
|
+
method: 'array_all_match',
|
|
180
|
+
column,
|
|
181
|
+
values: { pattern, matchType }
|
|
182
|
+
});
|
|
183
|
+
return this.parent;
|
|
184
|
+
}
|
|
185
|
+
allMatchPrefix(column, prefix) {
|
|
186
|
+
return this.allMatch(column, prefix, 'prefix');
|
|
187
|
+
}
|
|
188
|
+
allMatchSuffix(column, suffix) {
|
|
189
|
+
return this.allMatch(column, suffix, 'suffix');
|
|
190
|
+
}
|
|
191
|
+
allMatchSubstring(column, substring) {
|
|
192
|
+
return this.allMatch(column, substring, 'contains');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
function formatLikePattern(pattern, matchType) {
|
|
196
|
+
switch (matchType) {
|
|
197
|
+
case 'prefix':
|
|
198
|
+
return `${pattern}%`;
|
|
199
|
+
case 'suffix':
|
|
200
|
+
return `%${pattern}`;
|
|
201
|
+
case 'contains':
|
|
202
|
+
return `%${pattern}%`;
|
|
203
|
+
case 'exact':
|
|
204
|
+
return pattern;
|
|
205
|
+
default:
|
|
206
|
+
return `${pattern}%`;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
export function buildArrayConditionSQL(condition) {
|
|
210
|
+
const { method, column, values } = condition;
|
|
211
|
+
switch (method) {
|
|
212
|
+
case 'array_contains':
|
|
213
|
+
return format('%I @> ARRAY[%s]', column, values.map(v => format('%L', v)).join(','));
|
|
214
|
+
case 'array_contained_by':
|
|
215
|
+
return format('%I <@ ARRAY[%s]', column, values.map(v => format('%L', v)).join(','));
|
|
216
|
+
case 'array_overlaps':
|
|
217
|
+
return format('%I && ARRAY[%s]', column, values.map(v => format('%L', v)).join(','));
|
|
218
|
+
case 'array_equal':
|
|
219
|
+
return format('%I = ARRAY[%s]', column, values.map(v => format('%L', v)).join(','));
|
|
220
|
+
case 'array_not_equal':
|
|
221
|
+
return format('%I <> ARRAY[%s]', column, values.map(v => format('%L', v)).join(','));
|
|
222
|
+
case 'array_any': {
|
|
223
|
+
const { operator, value } = values;
|
|
224
|
+
return format('%L %s ANY(%I)', value, operator, column);
|
|
225
|
+
}
|
|
226
|
+
case 'array_all': {
|
|
227
|
+
const { operator, value } = values;
|
|
228
|
+
return format('%L %s ALL(%I)', value, operator, column);
|
|
229
|
+
}
|
|
230
|
+
case 'array_length':
|
|
231
|
+
return format('array_length(%I, 1) = %L', column, values);
|
|
232
|
+
case 'array_contains_pattern': {
|
|
233
|
+
const { pattern, matchType } = values;
|
|
234
|
+
const likePattern = formatLikePattern(pattern, matchType);
|
|
235
|
+
if (matchType === 'exact') {
|
|
236
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %L)', column, pattern);
|
|
237
|
+
}
|
|
238
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem LIKE %L)', column, likePattern);
|
|
239
|
+
}
|
|
240
|
+
case 'array_has_non_matching': {
|
|
241
|
+
const { pattern, matchType } = values;
|
|
242
|
+
const likePattern = formatLikePattern(pattern, matchType);
|
|
243
|
+
if (matchType === 'exact') {
|
|
244
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <> %L)', column, pattern);
|
|
245
|
+
}
|
|
246
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, likePattern);
|
|
247
|
+
}
|
|
248
|
+
case 'array_all_match': {
|
|
249
|
+
const { pattern, matchType } = values;
|
|
250
|
+
const likePattern = formatLikePattern(pattern, matchType);
|
|
251
|
+
if (matchType === 'exact') {
|
|
252
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <> %L)', column, pattern);
|
|
253
|
+
}
|
|
254
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, likePattern);
|
|
255
|
+
}
|
|
256
|
+
case 'array_append_value':
|
|
257
|
+
return format('array_append(%I, %L)', column, values);
|
|
258
|
+
case 'array_prepend_value':
|
|
259
|
+
return format('array_prepend(%L, %I)', values, column);
|
|
260
|
+
case 'array_remove_value':
|
|
261
|
+
return format('array_remove(%I, %L)', column, values);
|
|
262
|
+
case 'array_remove_pattern': {
|
|
263
|
+
const { pattern, matchType } = values;
|
|
264
|
+
const likePattern = formatLikePattern(pattern, matchType);
|
|
265
|
+
if (matchType === 'exact') {
|
|
266
|
+
return format('ARRAY(SELECT elem FROM unnest(%I) AS elem WHERE elem <> %L)', column, pattern);
|
|
267
|
+
}
|
|
268
|
+
return format('ARRAY(SELECT elem FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, likePattern);
|
|
269
|
+
}
|
|
270
|
+
case 'array_update_pattern': {
|
|
271
|
+
const { pattern, replacement, matchType } = values;
|
|
272
|
+
const likePattern = formatLikePattern(pattern, matchType);
|
|
273
|
+
if (matchType === 'exact') {
|
|
274
|
+
return format('ARRAY(SELECT CASE WHEN elem = %L THEN %L ELSE elem END FROM unnest(%I) AS elem)', pattern, replacement, column);
|
|
275
|
+
}
|
|
276
|
+
return format('ARRAY(SELECT CASE WHEN elem LIKE %L THEN %L ELSE elem END FROM unnest(%I) AS elem)', likePattern, replacement, column);
|
|
277
|
+
}
|
|
278
|
+
case 'array_string_starts_with': {
|
|
279
|
+
const { prefix } = values;
|
|
280
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem LIKE %L)', column, `${prefix}%`);
|
|
281
|
+
}
|
|
282
|
+
case 'array_string_ends_with': {
|
|
283
|
+
const { suffix } = values;
|
|
284
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem LIKE %L)', column, `%${suffix}`);
|
|
285
|
+
}
|
|
286
|
+
case 'array_string_contains': {
|
|
287
|
+
const { substring } = values;
|
|
288
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem LIKE %L)', column, `%${substring}%`);
|
|
289
|
+
}
|
|
290
|
+
case 'array_string_matches': {
|
|
291
|
+
const { pattern } = values;
|
|
292
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ~ %L)', column, pattern);
|
|
293
|
+
}
|
|
294
|
+
case 'array_string_imatches': {
|
|
295
|
+
const { pattern } = values;
|
|
296
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ~* %L)', column, pattern);
|
|
297
|
+
}
|
|
298
|
+
case 'array_string_ilike': {
|
|
299
|
+
const { pattern } = values;
|
|
300
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ILIKE %L)', column, pattern);
|
|
301
|
+
}
|
|
302
|
+
case 'array_string_all_start_with': {
|
|
303
|
+
const { prefix } = values;
|
|
304
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, `${prefix}%`);
|
|
305
|
+
}
|
|
306
|
+
case 'array_string_all_end_with': {
|
|
307
|
+
const { suffix } = values;
|
|
308
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, `%${suffix}`);
|
|
309
|
+
}
|
|
310
|
+
case 'array_string_all_contain': {
|
|
311
|
+
const { substring } = values;
|
|
312
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT LIKE %L)', column, `%${substring}%`);
|
|
313
|
+
}
|
|
314
|
+
case 'array_string_length_between': {
|
|
315
|
+
const { min, max } = values;
|
|
316
|
+
if (max !== undefined) {
|
|
317
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE length(elem) BETWEEN %s AND %s)', column, min, max);
|
|
318
|
+
}
|
|
319
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE length(elem) >= %s)', column, min);
|
|
320
|
+
}
|
|
321
|
+
case 'array_string_has_empty':
|
|
322
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = \'\')', column);
|
|
323
|
+
case 'array_string_has_non_empty':
|
|
324
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <> \'\')', column);
|
|
325
|
+
case 'array_string_has_uppercase':
|
|
326
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ~ \'[A-Z]\')', column);
|
|
327
|
+
case 'array_string_has_lowercase':
|
|
328
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ~ \'[a-z]\')', column);
|
|
329
|
+
case 'array_string_has_numeric':
|
|
330
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ~ \'^[0-9]+$\')', column);
|
|
331
|
+
case 'array_string_equals': {
|
|
332
|
+
const { value } = values;
|
|
333
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %L)', column, value);
|
|
334
|
+
}
|
|
335
|
+
case 'array_string_iequals': {
|
|
336
|
+
const { value } = values;
|
|
337
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE LOWER(elem) = LOWER(%L))', column, value);
|
|
338
|
+
}
|
|
339
|
+
case 'array_numeric_greater_than': {
|
|
340
|
+
const { value } = values;
|
|
341
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem > %s)', column, value);
|
|
342
|
+
}
|
|
343
|
+
case 'array_numeric_greater_than_or_equal': {
|
|
344
|
+
const { value } = values;
|
|
345
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem >= %s)', column, value);
|
|
346
|
+
}
|
|
347
|
+
case 'array_numeric_less_than': {
|
|
348
|
+
const { value } = values;
|
|
349
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem < %s)', column, value);
|
|
350
|
+
}
|
|
351
|
+
case 'array_numeric_less_than_or_equal': {
|
|
352
|
+
const { value } = values;
|
|
353
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <= %s)', column, value);
|
|
354
|
+
}
|
|
355
|
+
case 'array_numeric_between': {
|
|
356
|
+
const { min, max } = values;
|
|
357
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem BETWEEN %s AND %s)', column, min, max);
|
|
358
|
+
}
|
|
359
|
+
case 'array_numeric_all_greater_than': {
|
|
360
|
+
const { value } = values;
|
|
361
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <= %s)', column, value);
|
|
362
|
+
}
|
|
363
|
+
case 'array_numeric_all_less_than': {
|
|
364
|
+
const { value } = values;
|
|
365
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem >= %s)', column, value);
|
|
366
|
+
}
|
|
367
|
+
case 'array_numeric_all_between': {
|
|
368
|
+
const { min, max } = values;
|
|
369
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem NOT BETWEEN %s AND %s)', column, min, max);
|
|
370
|
+
}
|
|
371
|
+
case 'array_numeric_sum_equals': {
|
|
372
|
+
const { target } = values;
|
|
373
|
+
return format('(SELECT SUM(elem) FROM unnest(%I) AS elem) = %s', column, target);
|
|
374
|
+
}
|
|
375
|
+
case 'array_numeric_sum_greater_than': {
|
|
376
|
+
const { target } = values;
|
|
377
|
+
return format('(SELECT SUM(elem) FROM unnest(%I) AS elem) > %s', column, target);
|
|
378
|
+
}
|
|
379
|
+
case 'array_numeric_sum_less_than': {
|
|
380
|
+
const { target } = values;
|
|
381
|
+
return format('(SELECT SUM(elem) FROM unnest(%I) AS elem) < %s', column, target);
|
|
382
|
+
}
|
|
383
|
+
case 'array_numeric_avg_equals': {
|
|
384
|
+
const { target } = values;
|
|
385
|
+
return format('(SELECT AVG(elem) FROM unnest(%I) AS elem) = %s', column, target);
|
|
386
|
+
}
|
|
387
|
+
case 'array_numeric_avg_greater_than': {
|
|
388
|
+
const { target } = values;
|
|
389
|
+
return format('(SELECT AVG(elem) FROM unnest(%I) AS elem) > %s', column, target);
|
|
390
|
+
}
|
|
391
|
+
case 'array_numeric_avg_less_than': {
|
|
392
|
+
const { target } = values;
|
|
393
|
+
return format('(SELECT AVG(elem) FROM unnest(%I) AS elem) < %s', column, target);
|
|
394
|
+
}
|
|
395
|
+
case 'array_numeric_max_equals': {
|
|
396
|
+
const { target } = values;
|
|
397
|
+
return format('(SELECT MAX(elem) FROM unnest(%I) AS elem) = %s', column, target);
|
|
398
|
+
}
|
|
399
|
+
case 'array_numeric_min_equals': {
|
|
400
|
+
const { target } = values;
|
|
401
|
+
return format('(SELECT MIN(elem) FROM unnest(%I) AS elem) = %s', column, target);
|
|
402
|
+
}
|
|
403
|
+
case 'array_numeric_equals': {
|
|
404
|
+
const { value } = values;
|
|
405
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %s)', column, value);
|
|
406
|
+
}
|
|
407
|
+
case 'array_numeric_has_even':
|
|
408
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem %% 2 = 0)', column);
|
|
409
|
+
case 'array_numeric_has_odd':
|
|
410
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem %% 2 <> 0)', column);
|
|
411
|
+
case 'array_numeric_has_positive':
|
|
412
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem > 0)', column);
|
|
413
|
+
case 'array_numeric_has_negative':
|
|
414
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem < 0)', column);
|
|
415
|
+
case 'array_numeric_has_zero':
|
|
416
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = 0)', column);
|
|
417
|
+
case 'array_uuid_all_valid':
|
|
418
|
+
return format('NOT EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem::text !~ \'^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\')', column);
|
|
419
|
+
case 'array_uuid_has_version': {
|
|
420
|
+
const { version } = values;
|
|
421
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE substring(elem::text from 15 for 1) = %L)', column, String(version));
|
|
422
|
+
}
|
|
423
|
+
case 'array_uuid_equals': {
|
|
424
|
+
const { uuid } = values;
|
|
425
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %L::uuid)', column, uuid);
|
|
426
|
+
}
|
|
427
|
+
case 'array_date_before': {
|
|
428
|
+
const { date } = values;
|
|
429
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem < %L::timestamp)', column, date);
|
|
430
|
+
}
|
|
431
|
+
case 'array_date_after': {
|
|
432
|
+
const { date } = values;
|
|
433
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem > %L::timestamp)', column, date);
|
|
434
|
+
}
|
|
435
|
+
case 'array_date_between': {
|
|
436
|
+
const { start, end } = values;
|
|
437
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem BETWEEN %L::timestamp AND %L::timestamp)', column, start, end);
|
|
438
|
+
}
|
|
439
|
+
case 'array_date_within_days': {
|
|
440
|
+
const { days } = values;
|
|
441
|
+
if (days >= 0) {
|
|
442
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem BETWEEN NOW() AND NOW() + INTERVAL \'%s days\')', column, days);
|
|
443
|
+
}
|
|
444
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem BETWEEN NOW() - INTERVAL \'%s days\' AND NOW())', column, Math.abs(days));
|
|
445
|
+
}
|
|
446
|
+
case 'array_date_equals': {
|
|
447
|
+
const { date } = values;
|
|
448
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %L::timestamp)', column, date);
|
|
449
|
+
}
|
|
450
|
+
case 'array_date_has_today':
|
|
451
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem::date = CURRENT_DATE)', column);
|
|
452
|
+
case 'array_date_has_past':
|
|
453
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem < NOW())', column);
|
|
454
|
+
case 'array_date_has_future':
|
|
455
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem > NOW())', column);
|
|
456
|
+
case 'array_date_has_this_week':
|
|
457
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE date_trunc(\'week\', elem) = date_trunc(\'week\', NOW()))', column);
|
|
458
|
+
case 'array_date_has_this_month':
|
|
459
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE date_trunc(\'month\', elem) = date_trunc(\'month\', NOW()))', column);
|
|
460
|
+
case 'array_date_has_this_year':
|
|
461
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE date_trunc(\'year\', elem) = date_trunc(\'year\', NOW()))', column);
|
|
462
|
+
case 'array_jsonb_has_key': {
|
|
463
|
+
const { key } = values;
|
|
464
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem ? %L)', column, key);
|
|
465
|
+
}
|
|
466
|
+
case 'array_jsonb_has_path': {
|
|
467
|
+
const { path } = values;
|
|
468
|
+
const pathArray = path.split('.').map((p) => p.trim());
|
|
469
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem #> %L IS NOT NULL)', column, `{${pathArray.join(',')}}`);
|
|
470
|
+
}
|
|
471
|
+
case 'array_jsonb_contains': {
|
|
472
|
+
const { value } = values;
|
|
473
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem @> %L::jsonb)', column, JSON.stringify(value));
|
|
474
|
+
}
|
|
475
|
+
case 'array_jsonb_contained_by': {
|
|
476
|
+
const { value } = values;
|
|
477
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem <@ %L::jsonb)', column, JSON.stringify(value));
|
|
478
|
+
}
|
|
479
|
+
case 'array_jsonb_equals': {
|
|
480
|
+
const { value } = values;
|
|
481
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem = %L::jsonb)', column, JSON.stringify(value));
|
|
482
|
+
}
|
|
483
|
+
case 'array_jsonb_path_equals': {
|
|
484
|
+
const { path, value } = values;
|
|
485
|
+
const pathArray = path.split('.').map((p) => p.trim());
|
|
486
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE elem #> %L = %L::jsonb)', column, `{${pathArray.join(',')}}`, JSON.stringify(value));
|
|
487
|
+
}
|
|
488
|
+
case 'array_jsonb_has_object':
|
|
489
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE jsonb_typeof(elem) = \'object\')', column);
|
|
490
|
+
case 'array_jsonb_has_array':
|
|
491
|
+
return format('EXISTS (SELECT 1 FROM unnest(%I) AS elem WHERE jsonb_typeof(elem) = \'array\')', column);
|
|
492
|
+
default:
|
|
493
|
+
return '';
|
|
494
|
+
}
|
|
495
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export class ArrayNumericConditionBuilder {
|
|
2
|
+
parent;
|
|
3
|
+
constructor(parent) {
|
|
4
|
+
this.parent = parent;
|
|
5
|
+
}
|
|
6
|
+
greaterThan(column, value) {
|
|
7
|
+
this.parent.conditions.push({
|
|
8
|
+
method: 'array_numeric_greater_than',
|
|
9
|
+
column,
|
|
10
|
+
values: { value }
|
|
11
|
+
});
|
|
12
|
+
return this.parent;
|
|
13
|
+
}
|
|
14
|
+
greaterThanOrEqual(column, value) {
|
|
15
|
+
this.parent.conditions.push({
|
|
16
|
+
method: 'array_numeric_greater_than_or_equal',
|
|
17
|
+
column,
|
|
18
|
+
values: { value }
|
|
19
|
+
});
|
|
20
|
+
return this.parent;
|
|
21
|
+
}
|
|
22
|
+
lessThan(column, value) {
|
|
23
|
+
this.parent.conditions.push({
|
|
24
|
+
method: 'array_numeric_less_than',
|
|
25
|
+
column,
|
|
26
|
+
values: { value }
|
|
27
|
+
});
|
|
28
|
+
return this.parent;
|
|
29
|
+
}
|
|
30
|
+
lessThanOrEqual(column, value) {
|
|
31
|
+
this.parent.conditions.push({
|
|
32
|
+
method: 'array_numeric_less_than_or_equal',
|
|
33
|
+
column,
|
|
34
|
+
values: { value }
|
|
35
|
+
});
|
|
36
|
+
return this.parent;
|
|
37
|
+
}
|
|
38
|
+
between(column, min, max) {
|
|
39
|
+
this.parent.conditions.push({
|
|
40
|
+
method: 'array_numeric_between',
|
|
41
|
+
column,
|
|
42
|
+
values: { min, max }
|
|
43
|
+
});
|
|
44
|
+
return this.parent;
|
|
45
|
+
}
|
|
46
|
+
allGreaterThan(column, value) {
|
|
47
|
+
this.parent.conditions.push({
|
|
48
|
+
method: 'array_numeric_all_greater_than',
|
|
49
|
+
column,
|
|
50
|
+
values: { value }
|
|
51
|
+
});
|
|
52
|
+
return this.parent;
|
|
53
|
+
}
|
|
54
|
+
allLessThan(column, value) {
|
|
55
|
+
this.parent.conditions.push({
|
|
56
|
+
method: 'array_numeric_all_less_than',
|
|
57
|
+
column,
|
|
58
|
+
values: { value }
|
|
59
|
+
});
|
|
60
|
+
return this.parent;
|
|
61
|
+
}
|
|
62
|
+
allBetween(column, min, max) {
|
|
63
|
+
this.parent.conditions.push({
|
|
64
|
+
method: 'array_numeric_all_between',
|
|
65
|
+
column,
|
|
66
|
+
values: { min, max }
|
|
67
|
+
});
|
|
68
|
+
return this.parent;
|
|
69
|
+
}
|
|
70
|
+
sumEquals(column, target) {
|
|
71
|
+
this.parent.conditions.push({
|
|
72
|
+
method: 'array_numeric_sum_equals',
|
|
73
|
+
column,
|
|
74
|
+
values: { target }
|
|
75
|
+
});
|
|
76
|
+
return this.parent;
|
|
77
|
+
}
|
|
78
|
+
sumGreaterThan(column, target) {
|
|
79
|
+
this.parent.conditions.push({
|
|
80
|
+
method: 'array_numeric_sum_greater_than',
|
|
81
|
+
column,
|
|
82
|
+
values: { target }
|
|
83
|
+
});
|
|
84
|
+
return this.parent;
|
|
85
|
+
}
|
|
86
|
+
sumLessThan(column, target) {
|
|
87
|
+
this.parent.conditions.push({
|
|
88
|
+
method: 'array_numeric_sum_less_than',
|
|
89
|
+
column,
|
|
90
|
+
values: { target }
|
|
91
|
+
});
|
|
92
|
+
return this.parent;
|
|
93
|
+
}
|
|
94
|
+
avgEquals(column, target) {
|
|
95
|
+
this.parent.conditions.push({
|
|
96
|
+
method: 'array_numeric_avg_equals',
|
|
97
|
+
column,
|
|
98
|
+
values: { target }
|
|
99
|
+
});
|
|
100
|
+
return this.parent;
|
|
101
|
+
}
|
|
102
|
+
avgGreaterThan(column, target) {
|
|
103
|
+
this.parent.conditions.push({
|
|
104
|
+
method: 'array_numeric_avg_greater_than',
|
|
105
|
+
column,
|
|
106
|
+
values: { target }
|
|
107
|
+
});
|
|
108
|
+
return this.parent;
|
|
109
|
+
}
|
|
110
|
+
avgLessThan(column, target) {
|
|
111
|
+
this.parent.conditions.push({
|
|
112
|
+
method: 'array_numeric_avg_less_than',
|
|
113
|
+
column,
|
|
114
|
+
values: { target }
|
|
115
|
+
});
|
|
116
|
+
return this.parent;
|
|
117
|
+
}
|
|
118
|
+
maxEquals(column, target) {
|
|
119
|
+
this.parent.conditions.push({
|
|
120
|
+
method: 'array_numeric_max_equals',
|
|
121
|
+
column,
|
|
122
|
+
values: { target }
|
|
123
|
+
});
|
|
124
|
+
return this.parent;
|
|
125
|
+
}
|
|
126
|
+
minEquals(column, target) {
|
|
127
|
+
this.parent.conditions.push({
|
|
128
|
+
method: 'array_numeric_min_equals',
|
|
129
|
+
column,
|
|
130
|
+
values: { target }
|
|
131
|
+
});
|
|
132
|
+
return this.parent;
|
|
133
|
+
}
|
|
134
|
+
equals(column, value) {
|
|
135
|
+
this.parent.conditions.push({
|
|
136
|
+
method: 'array_numeric_equals',
|
|
137
|
+
column,
|
|
138
|
+
values: { value }
|
|
139
|
+
});
|
|
140
|
+
return this.parent;
|
|
141
|
+
}
|
|
142
|
+
hasEven(column) {
|
|
143
|
+
this.parent.conditions.push({
|
|
144
|
+
method: 'array_numeric_has_even',
|
|
145
|
+
column,
|
|
146
|
+
values: {}
|
|
147
|
+
});
|
|
148
|
+
return this.parent;
|
|
149
|
+
}
|
|
150
|
+
hasOdd(column) {
|
|
151
|
+
this.parent.conditions.push({
|
|
152
|
+
method: 'array_numeric_has_odd',
|
|
153
|
+
column,
|
|
154
|
+
values: {}
|
|
155
|
+
});
|
|
156
|
+
return this.parent;
|
|
157
|
+
}
|
|
158
|
+
hasPositive(column) {
|
|
159
|
+
this.parent.conditions.push({
|
|
160
|
+
method: 'array_numeric_has_positive',
|
|
161
|
+
column,
|
|
162
|
+
values: {}
|
|
163
|
+
});
|
|
164
|
+
return this.parent;
|
|
165
|
+
}
|
|
166
|
+
hasNegative(column) {
|
|
167
|
+
this.parent.conditions.push({
|
|
168
|
+
method: 'array_numeric_has_negative',
|
|
169
|
+
column,
|
|
170
|
+
values: {}
|
|
171
|
+
});
|
|
172
|
+
return this.parent;
|
|
173
|
+
}
|
|
174
|
+
hasZero(column) {
|
|
175
|
+
this.parent.conditions.push({
|
|
176
|
+
method: 'array_numeric_has_zero',
|
|
177
|
+
column,
|
|
178
|
+
values: {}
|
|
179
|
+
});
|
|
180
|
+
return this.parent;
|
|
181
|
+
}
|
|
182
|
+
}
|