ugly-app 0.1.161 → 0.1.163
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/server/PostgresFilter.d.ts.map +1 -1
- package/dist/server/PostgresFilter.js +31 -13
- package/dist/server/PostgresFilter.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/server/PostgresFilter.ts +31 -12
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.163";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresFilter.d.ts","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"PostgresFilter.d.ts","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,OAAO,EAAE,CAAC;CACnB;AAsBD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,gBAAgB,CA8FjF;AAED,iDAAiD;AACjD,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAOlE"}
|
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
* Fields are accessed via JSONB operators (data->>'field' for text, casts for numbers/booleans).
|
|
6
6
|
* Dot-notation paths (e.g. 'user.profile.name') are translated to -> chains.
|
|
7
7
|
*/
|
|
8
|
+
/** Fields stored as top-level columns rather than inside the JSONB data column. */
|
|
9
|
+
const TOP_LEVEL_COLUMNS = new Set(['_id', 'created', 'updated', 'version']);
|
|
8
10
|
/** Build the JSONB accessor for a field path. Last segment uses ->> (text extraction). */
|
|
9
11
|
function jsonbPath(field, asText = true) {
|
|
10
|
-
if (field
|
|
11
|
-
return
|
|
12
|
+
if (TOP_LEVEL_COLUMNS.has(field))
|
|
13
|
+
return `"${field}"`;
|
|
12
14
|
const parts = field.split('.');
|
|
13
15
|
if (parts.length === 1) {
|
|
14
16
|
return asText ? `data->>'${parts[0]}'` : `data->'${parts[0]}'`;
|
|
@@ -31,35 +33,51 @@ export function translateFilter(filter) {
|
|
|
31
33
|
for (const [op, operand] of Object.entries(value)) {
|
|
32
34
|
switch (op) {
|
|
33
35
|
case '$in':
|
|
34
|
-
|
|
36
|
+
// MongoDB: {field: {$in: [vals]}} matches if field is scalar and equals any val,
|
|
37
|
+
// OR if field is an array and contains any val.
|
|
38
|
+
// Use a combined clause: scalar match OR JSONB array overlap.
|
|
39
|
+
clauses.push(`(${jsonbPath(field)} = ANY($${paramIdx}) OR ${jsonbPath(field, false)} ?| $${paramIdx})`);
|
|
35
40
|
values.push(operand);
|
|
36
41
|
paramIdx++;
|
|
37
42
|
break;
|
|
38
43
|
case '$nin':
|
|
39
|
-
|
|
44
|
+
// Inverse: scalar not in ANY, AND array doesn't overlap
|
|
45
|
+
clauses.push(`(${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(field, false)} ?| $${paramIdx}))`);
|
|
40
46
|
values.push(operand);
|
|
41
47
|
paramIdx++;
|
|
42
48
|
break;
|
|
43
|
-
case '$gt':
|
|
44
|
-
|
|
49
|
+
case '$gt': {
|
|
50
|
+
const acc = jsonbPath(field);
|
|
51
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
52
|
+
clauses.push(`${cast} > $${paramIdx}`);
|
|
45
53
|
values.push(operand);
|
|
46
54
|
paramIdx++;
|
|
47
55
|
break;
|
|
48
|
-
|
|
49
|
-
|
|
56
|
+
}
|
|
57
|
+
case '$gte': {
|
|
58
|
+
const acc = jsonbPath(field);
|
|
59
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
60
|
+
clauses.push(`${cast} >= $${paramIdx}`);
|
|
50
61
|
values.push(operand);
|
|
51
62
|
paramIdx++;
|
|
52
63
|
break;
|
|
53
|
-
|
|
54
|
-
|
|
64
|
+
}
|
|
65
|
+
case '$lt': {
|
|
66
|
+
const acc = jsonbPath(field);
|
|
67
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
68
|
+
clauses.push(`${cast} < $${paramIdx}`);
|
|
55
69
|
values.push(operand);
|
|
56
70
|
paramIdx++;
|
|
57
71
|
break;
|
|
58
|
-
|
|
59
|
-
|
|
72
|
+
}
|
|
73
|
+
case '$lte': {
|
|
74
|
+
const acc = jsonbPath(field);
|
|
75
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
76
|
+
clauses.push(`${cast} <= $${paramIdx}`);
|
|
60
77
|
values.push(operand);
|
|
61
78
|
paramIdx++;
|
|
62
79
|
break;
|
|
80
|
+
}
|
|
63
81
|
case '$ne':
|
|
64
82
|
clauses.push(`${jsonbPath(field)} != $${paramIdx}`);
|
|
65
83
|
values.push(operand);
|
|
@@ -108,7 +126,7 @@ export function translateFilter(filter) {
|
|
|
108
126
|
export function translateSort(sort) {
|
|
109
127
|
return Object.entries(sort)
|
|
110
128
|
.map(([field, dir]) => {
|
|
111
|
-
const accessor = field
|
|
129
|
+
const accessor = TOP_LEVEL_COLUMNS.has(field) ? `"${field}"` : jsonbPath(field);
|
|
112
130
|
return `${accessor} ${dir === 1 ? 'ASC' : 'DESC'}`;
|
|
113
131
|
})
|
|
114
132
|
.join(', ');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresFilter.js","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,0FAA0F;AAC1F,SAAS,SAAS,CAAC,KAAa,EAAE,MAAM,GAAG,IAAI;IAC7C,IAAI,
|
|
1
|
+
{"version":3,"file":"PostgresFilter.js","sourceRoot":"","sources":["../../src/server/PostgresFilter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.163";
|
|
@@ -11,9 +11,12 @@ export interface TranslatedFilter {
|
|
|
11
11
|
values: unknown[];
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
+
/** Fields stored as top-level columns rather than inside the JSONB data column. */
|
|
15
|
+
const TOP_LEVEL_COLUMNS = new Set(['_id', 'created', 'updated', 'version']);
|
|
16
|
+
|
|
14
17
|
/** Build the JSONB accessor for a field path. Last segment uses ->> (text extraction). */
|
|
15
18
|
function jsonbPath(field: string, asText = true): string {
|
|
16
|
-
if (field
|
|
19
|
+
if (TOP_LEVEL_COLUMNS.has(field)) return `"${field}"`;
|
|
17
20
|
const parts = field.split('.');
|
|
18
21
|
if (parts.length === 1) {
|
|
19
22
|
return asText ? `data->>'${parts[0]}'` : `data->'${parts[0]}'`;
|
|
@@ -38,35 +41,51 @@ export function translateFilter(filter: Record<string, unknown>): TranslatedFilt
|
|
|
38
41
|
for (const [op, operand] of Object.entries(value as Record<string, unknown>)) {
|
|
39
42
|
switch (op) {
|
|
40
43
|
case '$in':
|
|
41
|
-
|
|
44
|
+
// MongoDB: {field: {$in: [vals]}} matches if field is scalar and equals any val,
|
|
45
|
+
// OR if field is an array and contains any val.
|
|
46
|
+
// Use a combined clause: scalar match OR JSONB array overlap.
|
|
47
|
+
clauses.push(`(${jsonbPath(field)} = ANY($${paramIdx}) OR ${jsonbPath(field, false)} ?| $${paramIdx})`);
|
|
42
48
|
values.push(operand);
|
|
43
49
|
paramIdx++;
|
|
44
50
|
break;
|
|
45
51
|
case '$nin':
|
|
46
|
-
|
|
52
|
+
// Inverse: scalar not in ANY, AND array doesn't overlap
|
|
53
|
+
clauses.push(`(${jsonbPath(field)} != ALL($${paramIdx}) AND NOT (${jsonbPath(field, false)} ?| $${paramIdx}))`);
|
|
47
54
|
values.push(operand);
|
|
48
55
|
paramIdx++;
|
|
49
56
|
break;
|
|
50
|
-
case '$gt':
|
|
51
|
-
|
|
57
|
+
case '$gt': {
|
|
58
|
+
const acc = jsonbPath(field);
|
|
59
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
60
|
+
clauses.push(`${cast} > $${paramIdx}`);
|
|
52
61
|
values.push(operand);
|
|
53
62
|
paramIdx++;
|
|
54
63
|
break;
|
|
55
|
-
|
|
56
|
-
|
|
64
|
+
}
|
|
65
|
+
case '$gte': {
|
|
66
|
+
const acc = jsonbPath(field);
|
|
67
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
68
|
+
clauses.push(`${cast} >= $${paramIdx}`);
|
|
57
69
|
values.push(operand);
|
|
58
70
|
paramIdx++;
|
|
59
71
|
break;
|
|
60
|
-
|
|
61
|
-
|
|
72
|
+
}
|
|
73
|
+
case '$lt': {
|
|
74
|
+
const acc = jsonbPath(field);
|
|
75
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
76
|
+
clauses.push(`${cast} < $${paramIdx}`);
|
|
62
77
|
values.push(operand);
|
|
63
78
|
paramIdx++;
|
|
64
79
|
break;
|
|
65
|
-
|
|
66
|
-
|
|
80
|
+
}
|
|
81
|
+
case '$lte': {
|
|
82
|
+
const acc = jsonbPath(field);
|
|
83
|
+
const cast = TOP_LEVEL_COLUMNS.has(field) ? acc : `(${acc})::numeric`;
|
|
84
|
+
clauses.push(`${cast} <= $${paramIdx}`);
|
|
67
85
|
values.push(operand);
|
|
68
86
|
paramIdx++;
|
|
69
87
|
break;
|
|
88
|
+
}
|
|
70
89
|
case '$ne':
|
|
71
90
|
clauses.push(`${jsonbPath(field)} != $${paramIdx}`);
|
|
72
91
|
values.push(operand);
|
|
@@ -112,7 +131,7 @@ export function translateFilter(filter: Record<string, unknown>): TranslatedFilt
|
|
|
112
131
|
export function translateSort(sort: Record<string, 1 | -1>): string {
|
|
113
132
|
return Object.entries(sort)
|
|
114
133
|
.map(([field, dir]) => {
|
|
115
|
-
const accessor = field
|
|
134
|
+
const accessor = TOP_LEVEL_COLUMNS.has(field) ? `"${field}"` : jsonbPath(field);
|
|
116
135
|
return `${accessor} ${dir === 1 ? 'ASC' : 'DESC'}`;
|
|
117
136
|
})
|
|
118
137
|
.join(', ');
|