@nicia-ai/typegraph 0.31.0 → 0.33.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 +31 -0
- package/dist/backend/postgres/index.cjs +31 -18
- package/dist/backend/postgres/index.d.cts +6 -6
- package/dist/backend/postgres/index.d.ts +6 -6
- package/dist/backend/postgres/index.js +9 -8
- package/dist/backend/postgres/pglite.cjs +13 -12
- package/dist/backend/postgres/pglite.cjs.map +1 -1
- package/dist/backend/postgres/pglite.d.cts +3 -3
- package/dist/backend/postgres/pglite.d.ts +3 -3
- package/dist/backend/postgres/pglite.js +9 -8
- package/dist/backend/postgres/pglite.js.map +1 -1
- package/dist/backend/sqlite/index.cjs +29 -16
- package/dist/backend/sqlite/index.d.cts +7 -7
- package/dist/backend/sqlite/index.d.ts +7 -7
- package/dist/backend/sqlite/index.js +8 -7
- package/dist/backend/sqlite/libsql.cjs +13 -12
- package/dist/backend/sqlite/libsql.cjs.map +1 -1
- package/dist/backend/sqlite/libsql.d.cts +3 -3
- package/dist/backend/sqlite/libsql.d.ts +3 -3
- package/dist/backend/sqlite/libsql.js +9 -8
- package/dist/backend/sqlite/libsql.js.map +1 -1
- package/dist/backend/sqlite/local.cjs +14 -13
- package/dist/backend/sqlite/local.cjs.map +1 -1
- package/dist/backend/sqlite/local.d.cts +3 -3
- package/dist/backend/sqlite/local.d.ts +3 -3
- package/dist/backend/sqlite/local.js +9 -8
- package/dist/backend/sqlite/local.js.map +1 -1
- package/dist/{chunk-SFFJ2IKN.cjs → chunk-3642VBVC.cjs} +70 -68
- package/dist/chunk-3642VBVC.cjs.map +1 -0
- package/dist/chunk-3E7SNSIA.cjs +55 -0
- package/dist/chunk-3E7SNSIA.cjs.map +1 -0
- package/dist/{chunk-6RMLO5O4.cjs → chunk-3IR2GEMJ.cjs} +8 -7
- package/dist/chunk-3IR2GEMJ.cjs.map +1 -0
- package/dist/{chunk-6SA7UIQJ.cjs → chunk-3QRBXYT5.cjs} +6 -6
- package/dist/{chunk-6SA7UIQJ.cjs.map → chunk-3QRBXYT5.cjs.map} +1 -1
- package/dist/{chunk-54JVNOAQ.cjs → chunk-4RBAJVEC.cjs} +128 -6
- package/dist/chunk-4RBAJVEC.cjs.map +1 -0
- package/dist/{chunk-IJORSAC3.js → chunk-6NRFUHMS.js} +4 -3
- package/dist/chunk-6NRFUHMS.js.map +1 -0
- package/dist/{chunk-FLOI7QOT.cjs → chunk-BF3ZDEUE.cjs} +104 -72
- package/dist/chunk-BF3ZDEUE.cjs.map +1 -0
- package/dist/{chunk-2HZGWCB4.js → chunk-C4C4Q7A6.js} +3 -3
- package/dist/chunk-C4C4Q7A6.js.map +1 -0
- package/dist/{chunk-O4VUR6SI.js → chunk-CEF2QOTO.js} +3 -3
- package/dist/{chunk-O4VUR6SI.js.map → chunk-CEF2QOTO.js.map} +1 -1
- package/dist/{chunk-V4IQYOQ4.cjs → chunk-CFNT3ITG.cjs} +3 -3
- package/dist/chunk-CFNT3ITG.cjs.map +1 -0
- package/dist/{chunk-LJLMDDCW.js → chunk-CWFPJ3RC.js} +3 -3
- package/dist/{chunk-LJLMDDCW.js.map → chunk-CWFPJ3RC.js.map} +1 -1
- package/dist/{chunk-RZ4DH4E7.cjs → chunk-D3EWZ67S.cjs} +3348 -2030
- package/dist/chunk-D3EWZ67S.cjs.map +1 -0
- package/dist/{chunk-GKFWM3DS.js → chunk-DJYRRDHA.js} +124 -5
- package/dist/chunk-DJYRRDHA.js.map +1 -0
- package/dist/{chunk-YQGLVWB2.cjs → chunk-EF3Z645U.cjs} +2 -52
- package/dist/chunk-EF3Z645U.cjs.map +1 -0
- package/dist/{chunk-ASYQDPPU.cjs → chunk-FDN43KXV.cjs} +19 -19
- package/dist/{chunk-ASYQDPPU.cjs.map → chunk-FDN43KXV.cjs.map} +1 -1
- package/dist/chunk-GYVBEZAO.js +120 -0
- package/dist/chunk-GYVBEZAO.js.map +1 -0
- package/dist/chunk-I4W7MKVG.cjs +1526 -0
- package/dist/chunk-I4W7MKVG.cjs.map +1 -0
- package/dist/{chunk-MXE2U3EX.js → chunk-IZ4PCL47.js} +3 -52
- package/dist/chunk-IZ4PCL47.js.map +1 -0
- package/dist/{chunk-4A4GUZTQ.js → chunk-JHOBXD7O.js} +10 -8
- package/dist/chunk-JHOBXD7O.js.map +1 -0
- package/dist/{chunk-CIINW6PS.cjs → chunk-KY5SDVA7.cjs} +676 -635
- package/dist/chunk-KY5SDVA7.cjs.map +1 -0
- package/dist/{chunk-N2MBPTAF.cjs → chunk-LM2IC4ZJ.cjs} +14 -14
- package/dist/{chunk-N2MBPTAF.cjs.map → chunk-LM2IC4ZJ.cjs.map} +1 -1
- package/dist/{chunk-7JGLPAFV.cjs → chunk-MBLXCV2Y.cjs} +16 -16
- package/dist/chunk-MBLXCV2Y.cjs.map +1 -0
- package/dist/{chunk-5DTPBFX5.cjs → chunk-NG5N7R45.cjs} +28 -28
- package/dist/{chunk-5DTPBFX5.cjs.map → chunk-NG5N7R45.cjs.map} +1 -1
- package/dist/chunk-OIE2UPVG.cjs +126 -0
- package/dist/chunk-OIE2UPVG.cjs.map +1 -0
- package/dist/{chunk-STP7QVUB.js → chunk-OS6KS3HV.js} +43 -11
- package/dist/chunk-OS6KS3HV.js.map +1 -0
- package/dist/{chunk-2ZY4K43M.js → chunk-PIHXFF73.js} +3 -3
- package/dist/{chunk-2ZY4K43M.js.map → chunk-PIHXFF73.js.map} +1 -1
- package/dist/{chunk-ATTXBMAX.js → chunk-PRMKPFN5.js} +3 -3
- package/dist/{chunk-ATTXBMAX.js.map → chunk-PRMKPFN5.js.map} +1 -1
- package/dist/chunk-PYD3UCDU.js +1480 -0
- package/dist/chunk-PYD3UCDU.js.map +1 -0
- package/dist/{chunk-MAQJYNJR.js → chunk-QBYTJSAY.js} +14 -16
- package/dist/chunk-QBYTJSAY.js.map +1 -0
- package/dist/{chunk-THX25XW6.js → chunk-SPT5JMME.js} +27 -7
- package/dist/chunk-SPT5JMME.js.map +1 -0
- package/dist/{chunk-3JBJEYWE.cjs → chunk-SST7XDY6.cjs} +32 -12
- package/dist/chunk-SST7XDY6.cjs.map +1 -0
- package/dist/{chunk-VZX2KSY3.js → chunk-UPDMJEW6.js} +608 -563
- package/dist/chunk-UPDMJEW6.js.map +1 -0
- package/dist/{chunk-UIFEEPME.js → chunk-WLP6TKFB.js} +3141 -1823
- package/dist/chunk-WLP6TKFB.js.map +1 -0
- package/dist/{chunk-VMEWZU2N.cjs → chunk-WWVV44DY.cjs} +11 -11
- package/dist/{chunk-VMEWZU2N.cjs.map → chunk-WWVV44DY.cjs.map} +1 -1
- package/dist/{chunk-UJ4V3YUQ.js → chunk-XKNAK27R.js} +3 -3
- package/dist/{chunk-UJ4V3YUQ.js.map → chunk-XKNAK27R.js.map} +1 -1
- package/dist/chunk-XLUNB2TZ.js +53 -0
- package/dist/chunk-XLUNB2TZ.js.map +1 -0
- package/dist/{chunk-XKJQQQVR.js → chunk-XVUJY72M.js} +6 -6
- package/dist/{chunk-XKJQQQVR.js.map → chunk-XVUJY72M.js.map} +1 -1
- package/dist/{chunk-5CN7B4CZ.cjs → chunk-YW7GHMF4.cjs} +17 -17
- package/dist/{chunk-5CN7B4CZ.cjs.map → chunk-YW7GHMF4.cjs.map} +1 -1
- package/dist/{ddl-BJcPrB4L.d.ts → ddl-CVnHJcar.d.ts} +3 -3
- package/dist/{ddl-CPZ7mB7X.d.cts → ddl-Dxt_fBHr.d.cts} +3 -3
- package/dist/{extension-types-D1k0inWU.d.cts → extension-types-YGFJPrzK.d.cts} +1 -1
- package/dist/{extension-types-D1k0inWU.d.ts → extension-types-YGFJPrzK.d.ts} +1 -1
- package/dist/graph-extension/index.d.cts +4 -4
- package/dist/graph-extension/index.d.ts +4 -4
- package/dist/graph-merge/index.cjs +200 -55
- package/dist/graph-merge/index.cjs.map +1 -1
- package/dist/graph-merge/index.d.cts +6 -6
- package/dist/graph-merge/index.d.ts +6 -6
- package/dist/graph-merge/index.js +185 -40
- package/dist/graph-merge/index.js.map +1 -1
- package/dist/{index-BEK0VtNB.d.ts → index-DGX6D9j1.d.ts} +2 -2
- package/dist/{index-C8sSTErx.d.cts → index-SEvUHDA6.d.cts} +2 -2
- package/dist/index.cjs +145 -116
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -55
- package/dist/index.d.ts +25 -55
- package/dist/index.js +19 -17
- package/dist/index.js.map +1 -1
- package/dist/indexes/index.cjs +15 -14
- package/dist/indexes/index.d.cts +5 -5
- package/dist/indexes/index.d.ts +5 -5
- package/dist/indexes/index.js +6 -5
- package/dist/interchange/index.cjs +15 -15
- package/dist/interchange/index.d.cts +9 -9
- package/dist/interchange/index.d.ts +9 -9
- package/dist/interchange/index.js +2 -2
- package/dist/{manager-Np7VVSlE.d.cts → manager-BYl_zyZR.d.cts} +2 -2
- package/dist/{manager-By-WEd8M.d.ts → manager-C0_r0ALf.d.ts} +2 -2
- package/dist/{materialize-indexes-CAGhqPHQ.d.ts → materialize-indexes-CAkIYFV-.d.ts} +1 -1
- package/dist/{materialize-indexes-DEYkU-wr.d.cts → materialize-indexes-D20xNluI.d.cts} +1 -1
- package/dist/{postgres-4J2tmauh.d.cts → postgres-MzBPkYzq.d.ts} +2651 -596
- package/dist/{postgres-BdIb7tS_.d.ts → postgres-_9psmVGm.d.cts} +2651 -596
- package/dist/profiler/index.cjs +4 -3
- package/dist/profiler/index.cjs.map +1 -1
- package/dist/profiler/index.d.cts +7 -7
- package/dist/profiler/index.d.ts +7 -7
- package/dist/profiler/index.js +2 -1
- package/dist/profiler/index.js.map +1 -1
- package/dist/schema/index.cjs +30 -29
- package/dist/schema/index.cjs.map +1 -1
- package/dist/schema/index.d.cts +7 -7
- package/dist/schema/index.d.ts +7 -7
- package/dist/schema/index.js +7 -6
- package/dist/schema/index.js.map +1 -1
- package/dist/{sqlite-aM_PAz-O.d.ts → sqlite-BfksSb45.d.cts} +2726 -455
- package/dist/{sqlite-Gatk_iw_.d.cts → sqlite-gm44dShb.d.ts} +2726 -455
- package/dist/{store-DuCbdqsh.d.cts → store-view-9jQ2rPum.d.cts} +1101 -465
- package/dist/{store-MloRPwb9.d.ts → store-view-FfE5_7eo.d.ts} +1101 -465
- package/dist/{types-DoByHGyU.d.cts → types-B6mhrcLv.d.cts} +2 -2
- package/dist/{types-C1CYxWrL.d.cts → types-C_UnQOQp.d.cts} +154 -23
- package/dist/{types-K3vpaJAL.d.ts → types-CdWxK-nD.d.ts} +2 -2
- package/dist/{types-BKQljXom.d.ts → types-DGylBhWo.d.ts} +154 -23
- package/dist/{where-DydZjGOb.d.cts → where-Bpp2ul_z.d.cts} +2 -2
- package/dist/{where-Dt49bvo6.d.ts → where-BsEXraKW.d.ts} +2 -2
- package/package.json +2 -2
- package/dist/chunk-2HZGWCB4.js.map +0 -1
- package/dist/chunk-3JBJEYWE.cjs.map +0 -1
- package/dist/chunk-4A4GUZTQ.js.map +0 -1
- package/dist/chunk-54JVNOAQ.cjs.map +0 -1
- package/dist/chunk-6G35I3VW.cjs +0 -40
- package/dist/chunk-6G35I3VW.cjs.map +0 -1
- package/dist/chunk-6RMLO5O4.cjs.map +0 -1
- package/dist/chunk-7JGLPAFV.cjs.map +0 -1
- package/dist/chunk-CIINW6PS.cjs.map +0 -1
- package/dist/chunk-FLOI7QOT.cjs.map +0 -1
- package/dist/chunk-GKFWM3DS.js.map +0 -1
- package/dist/chunk-IJORSAC3.js.map +0 -1
- package/dist/chunk-M6OC455F.js +0 -65
- package/dist/chunk-M6OC455F.js.map +0 -1
- package/dist/chunk-MAQJYNJR.js.map +0 -1
- package/dist/chunk-MXE2U3EX.js.map +0 -1
- package/dist/chunk-RP7YITHX.cjs +0 -70
- package/dist/chunk-RP7YITHX.cjs.map +0 -1
- package/dist/chunk-RZ4DH4E7.cjs.map +0 -1
- package/dist/chunk-SAJSMR2B.js +0 -35
- package/dist/chunk-SAJSMR2B.js.map +0 -1
- package/dist/chunk-SFFJ2IKN.cjs.map +0 -1
- package/dist/chunk-STP7QVUB.js.map +0 -1
- package/dist/chunk-THX25XW6.js.map +0 -1
- package/dist/chunk-UIFEEPME.js.map +0 -1
- package/dist/chunk-V4IQYOQ4.cjs.map +0 -1
- package/dist/chunk-VZX2KSY3.js.map +0 -1
- package/dist/chunk-YQGLVWB2.cjs.map +0 -1
|
@@ -0,0 +1,1526 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk3E7SNSIA_cjs = require('./chunk-3E7SNSIA.cjs');
|
|
4
|
+
var chunkJIEJCTDS_cjs = require('./chunk-JIEJCTDS.cjs');
|
|
5
|
+
var chunkFLRCVI2G_cjs = require('./chunk-FLRCVI2G.cjs');
|
|
6
|
+
var drizzleOrm = require('drizzle-orm');
|
|
7
|
+
|
|
8
|
+
// src/query/subquery-utils.ts
|
|
9
|
+
function normalizeValueType(valueType) {
|
|
10
|
+
if (valueType === void 0 || valueType === "unknown") {
|
|
11
|
+
return void 0;
|
|
12
|
+
}
|
|
13
|
+
return valueType;
|
|
14
|
+
}
|
|
15
|
+
function isUnsupportedInSubqueryValueType(valueType) {
|
|
16
|
+
const normalized = normalizeValueType(valueType);
|
|
17
|
+
return normalized === "array" || normalized === "object" || normalized === "embedding";
|
|
18
|
+
}
|
|
19
|
+
function isInSubqueryTypeCompatible(left, right) {
|
|
20
|
+
const normalizedLeft = normalizeValueType(left);
|
|
21
|
+
const normalizedRight = normalizeValueType(right);
|
|
22
|
+
if (normalizedLeft === void 0 || normalizedRight === void 0) {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
return normalizedLeft === normalizedRight;
|
|
26
|
+
}
|
|
27
|
+
function getAggregateValueType(aggregate) {
|
|
28
|
+
switch (aggregate.function) {
|
|
29
|
+
case "count":
|
|
30
|
+
case "countDistinct":
|
|
31
|
+
case "sum":
|
|
32
|
+
case "avg": {
|
|
33
|
+
return "number";
|
|
34
|
+
}
|
|
35
|
+
case "min":
|
|
36
|
+
case "max": {
|
|
37
|
+
return normalizeValueType(aggregate.field.valueType);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function getProjectedValueTypes(subquery) {
|
|
42
|
+
if (subquery.selectiveFields && subquery.selectiveFields.length > 0) {
|
|
43
|
+
return subquery.selectiveFields.map(
|
|
44
|
+
(field) => normalizeValueType(field.valueType)
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
return subquery.projection.fields.map((field) => {
|
|
48
|
+
if (field.source.__type === "aggregate") {
|
|
49
|
+
return getAggregateValueType(field.source);
|
|
50
|
+
}
|
|
51
|
+
return normalizeValueType(field.source.valueType);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
function getSubqueryColumnCount(subquery) {
|
|
55
|
+
return getProjectedValueTypes(subquery).length;
|
|
56
|
+
}
|
|
57
|
+
function getSingleSubqueryColumnValueType(subquery) {
|
|
58
|
+
const valueTypes = getProjectedValueTypes(subquery);
|
|
59
|
+
if (valueTypes.length !== 1) {
|
|
60
|
+
return void 0;
|
|
61
|
+
}
|
|
62
|
+
return valueTypes[0];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// src/query/predicates.ts
|
|
66
|
+
function predicate(expr) {
|
|
67
|
+
return {
|
|
68
|
+
__expr: expr,
|
|
69
|
+
and: (other) => predicate({
|
|
70
|
+
__type: "and",
|
|
71
|
+
predicates: [expr, other.__expr]
|
|
72
|
+
}),
|
|
73
|
+
or: (other) => predicate({
|
|
74
|
+
__type: "or",
|
|
75
|
+
predicates: [expr, other.__expr]
|
|
76
|
+
}),
|
|
77
|
+
not: () => predicate({
|
|
78
|
+
__type: "not",
|
|
79
|
+
predicate: expr
|
|
80
|
+
})
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function param(name) {
|
|
84
|
+
return { __type: "parameter", name };
|
|
85
|
+
}
|
|
86
|
+
function isParameterRef(value) {
|
|
87
|
+
if (typeof value !== "object" || value === null) return false;
|
|
88
|
+
return value.__type === "parameter";
|
|
89
|
+
}
|
|
90
|
+
function fieldRef(alias, path, options) {
|
|
91
|
+
return {
|
|
92
|
+
__type: "field_ref",
|
|
93
|
+
alias,
|
|
94
|
+
path,
|
|
95
|
+
...options?.jsonPointer !== void 0 && {
|
|
96
|
+
jsonPointer: options.jsonPointer
|
|
97
|
+
},
|
|
98
|
+
...options?.valueType !== void 0 && { valueType: options.valueType },
|
|
99
|
+
...options?.elementType !== void 0 && {
|
|
100
|
+
elementType: options.elementType
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
function coerceLiteralValue(value) {
|
|
105
|
+
if (value instanceof Date) {
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
109
|
+
return value;
|
|
110
|
+
}
|
|
111
|
+
throw new Error(`Unsupported literal value type: ${typeof value}`);
|
|
112
|
+
}
|
|
113
|
+
function inferLiteralValueType(value) {
|
|
114
|
+
if (typeof value === "string") {
|
|
115
|
+
return "string";
|
|
116
|
+
}
|
|
117
|
+
if (typeof value === "number") {
|
|
118
|
+
return "number";
|
|
119
|
+
}
|
|
120
|
+
return "boolean";
|
|
121
|
+
}
|
|
122
|
+
function literal(value) {
|
|
123
|
+
if (value instanceof Date) {
|
|
124
|
+
return { __type: "literal", value: value.toISOString(), valueType: "date" };
|
|
125
|
+
}
|
|
126
|
+
const valueType = inferLiteralValueType(value);
|
|
127
|
+
return {
|
|
128
|
+
__type: "literal",
|
|
129
|
+
value,
|
|
130
|
+
valueType
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function comparison(op, field, value) {
|
|
134
|
+
if (isParameterRef(value)) {
|
|
135
|
+
const expr2 = {
|
|
136
|
+
__type: "comparison",
|
|
137
|
+
op,
|
|
138
|
+
left: field,
|
|
139
|
+
right: value
|
|
140
|
+
};
|
|
141
|
+
return predicate(expr2);
|
|
142
|
+
}
|
|
143
|
+
const coercedValue = coerceLiteralValue(value);
|
|
144
|
+
const expr = {
|
|
145
|
+
__type: "comparison",
|
|
146
|
+
op,
|
|
147
|
+
left: field,
|
|
148
|
+
right: literal(coercedValue)
|
|
149
|
+
};
|
|
150
|
+
return predicate(expr);
|
|
151
|
+
}
|
|
152
|
+
function inComparison(op, field, values) {
|
|
153
|
+
const literals = values.map((value) => literal(coerceLiteralValue(value)));
|
|
154
|
+
const expr = {
|
|
155
|
+
__type: "comparison",
|
|
156
|
+
op,
|
|
157
|
+
left: field,
|
|
158
|
+
right: literals
|
|
159
|
+
};
|
|
160
|
+
return predicate(expr);
|
|
161
|
+
}
|
|
162
|
+
function stringOp(op, field, pattern) {
|
|
163
|
+
if (isParameterRef(pattern)) {
|
|
164
|
+
const expr2 = {
|
|
165
|
+
__type: "string_op",
|
|
166
|
+
op,
|
|
167
|
+
field,
|
|
168
|
+
pattern
|
|
169
|
+
};
|
|
170
|
+
return predicate(expr2);
|
|
171
|
+
}
|
|
172
|
+
const expr = {
|
|
173
|
+
__type: "string_op",
|
|
174
|
+
op,
|
|
175
|
+
field,
|
|
176
|
+
pattern
|
|
177
|
+
};
|
|
178
|
+
return predicate(expr);
|
|
179
|
+
}
|
|
180
|
+
function nullCheck(op, field) {
|
|
181
|
+
const expr = {
|
|
182
|
+
__type: "null_check",
|
|
183
|
+
op,
|
|
184
|
+
field
|
|
185
|
+
};
|
|
186
|
+
return predicate(expr);
|
|
187
|
+
}
|
|
188
|
+
function between(field, lower, upper) {
|
|
189
|
+
const expr = {
|
|
190
|
+
__type: "between",
|
|
191
|
+
field,
|
|
192
|
+
lower: isParameterRef(lower) ? lower : literal(lower),
|
|
193
|
+
upper: isParameterRef(upper) ? upper : literal(upper)
|
|
194
|
+
};
|
|
195
|
+
return predicate(expr);
|
|
196
|
+
}
|
|
197
|
+
function baseFieldBuilder(field) {
|
|
198
|
+
return {
|
|
199
|
+
eq: (value) => comparison("eq", field, value),
|
|
200
|
+
neq: (value) => comparison("neq", field, value),
|
|
201
|
+
isNull: () => nullCheck("isNull", field),
|
|
202
|
+
isNotNull: () => nullCheck("isNotNull", field),
|
|
203
|
+
in: (values) => inComparison("in", field, values),
|
|
204
|
+
notIn: (values) => inComparison("notIn", field, values)
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
function stringField(field) {
|
|
208
|
+
return {
|
|
209
|
+
...baseFieldBuilder(field),
|
|
210
|
+
gt: (value) => comparison("gt", field, value),
|
|
211
|
+
gte: (value) => comparison("gte", field, value),
|
|
212
|
+
lt: (value) => comparison("lt", field, value),
|
|
213
|
+
lte: (value) => comparison("lte", field, value),
|
|
214
|
+
contains: (pattern) => stringOp("contains", field, pattern),
|
|
215
|
+
startsWith: (pattern) => stringOp("startsWith", field, pattern),
|
|
216
|
+
endsWith: (pattern) => stringOp("endsWith", field, pattern),
|
|
217
|
+
like: (pattern) => stringOp("like", field, pattern),
|
|
218
|
+
ilike: (pattern) => stringOp("ilike", field, pattern)
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
var DEFAULT_FULLTEXT_MATCH_K = 50;
|
|
222
|
+
function createFulltextAccessor(alias, hasSearchableField) {
|
|
223
|
+
return {
|
|
224
|
+
matches: (query, k, options) => {
|
|
225
|
+
if (!hasSearchableField()) {
|
|
226
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
227
|
+
`Cannot call .$fulltext.matches() on alias "${alias}" \u2014 its node kind has no fields declared with searchable(). Add at least one: \`title: searchable({ language: "english" })\`.`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
return fulltextMatch(
|
|
231
|
+
fieldRef(alias, ["$fulltext"]),
|
|
232
|
+
query,
|
|
233
|
+
k ?? DEFAULT_FULLTEXT_MATCH_K,
|
|
234
|
+
options
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
function fulltextMatch(field, query, limit, options) {
|
|
240
|
+
if (!Number.isFinite(limit) || limit <= 0) {
|
|
241
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
242
|
+
`matches() limit must be a positive finite number, got ${String(limit)}`
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
const expr = {
|
|
246
|
+
__type: "fulltext_match",
|
|
247
|
+
field,
|
|
248
|
+
query,
|
|
249
|
+
mode: options?.mode ?? "websearch",
|
|
250
|
+
limit,
|
|
251
|
+
...options?.language === void 0 ? {} : { language: options.language },
|
|
252
|
+
...options?.minScore === void 0 ? {} : { minScore: options.minScore }
|
|
253
|
+
};
|
|
254
|
+
return predicate(expr);
|
|
255
|
+
}
|
|
256
|
+
function numberField(field) {
|
|
257
|
+
return {
|
|
258
|
+
...baseFieldBuilder(field),
|
|
259
|
+
gt: (value) => comparison("gt", field, value),
|
|
260
|
+
gte: (value) => comparison("gte", field, value),
|
|
261
|
+
lt: (value) => comparison("lt", field, value),
|
|
262
|
+
lte: (value) => comparison("lte", field, value),
|
|
263
|
+
between: (lower, upper) => between(field, lower, upper)
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
function dateField(field) {
|
|
267
|
+
return {
|
|
268
|
+
...baseFieldBuilder(field),
|
|
269
|
+
gt: (value) => comparison("gt", field, value),
|
|
270
|
+
gte: (value) => comparison("gte", field, value),
|
|
271
|
+
lt: (value) => comparison("lt", field, value),
|
|
272
|
+
lte: (value) => comparison("lte", field, value),
|
|
273
|
+
between: (lower, upper) => between(field, lower, upper)
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
function baseField(field) {
|
|
277
|
+
return baseFieldBuilder(field);
|
|
278
|
+
}
|
|
279
|
+
function arrayOp(op, field, values, length) {
|
|
280
|
+
const expr = {
|
|
281
|
+
__type: "array_op",
|
|
282
|
+
op,
|
|
283
|
+
field,
|
|
284
|
+
...values !== void 0 && {
|
|
285
|
+
values: values.map((value) => literal(coerceLiteralValue(value)))
|
|
286
|
+
},
|
|
287
|
+
...length !== void 0 && { length }
|
|
288
|
+
};
|
|
289
|
+
return predicate(expr);
|
|
290
|
+
}
|
|
291
|
+
function arrayField(field) {
|
|
292
|
+
return {
|
|
293
|
+
...baseFieldBuilder(field),
|
|
294
|
+
contains: (value) => arrayOp("contains", field, [value]),
|
|
295
|
+
containsAll: (values) => arrayOp("containsAll", field, values),
|
|
296
|
+
containsAny: (values) => arrayOp("containsAny", field, values),
|
|
297
|
+
isEmpty: () => arrayOp("isEmpty", field),
|
|
298
|
+
isNotEmpty: () => arrayOp("isNotEmpty", field),
|
|
299
|
+
lengthEq: (length) => arrayOp("lengthEq", field, void 0, length),
|
|
300
|
+
lengthGt: (length) => arrayOp("lengthGt", field, void 0, length),
|
|
301
|
+
lengthGte: (length) => arrayOp("lengthGte", field, void 0, length),
|
|
302
|
+
lengthLt: (length) => arrayOp("lengthLt", field, void 0, length),
|
|
303
|
+
lengthLte: (length) => arrayOp("lengthLte", field, void 0, length)
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
function vectorSimilarity(field, queryEmbedding, limit, options) {
|
|
307
|
+
const expr = {
|
|
308
|
+
__type: "vector_similarity",
|
|
309
|
+
field,
|
|
310
|
+
queryEmbedding,
|
|
311
|
+
// Leave metric unset when the caller didn't specify one, so the compiler
|
|
312
|
+
// resolves the field's declared metric per kind. Defaulting to "cosine"
|
|
313
|
+
// here would mis-rank l2/inner_product fields and bypass their ANN index.
|
|
314
|
+
...options?.metric !== void 0 && { metric: options.metric },
|
|
315
|
+
limit,
|
|
316
|
+
...options?.minScore !== void 0 && { minScore: options.minScore }
|
|
317
|
+
};
|
|
318
|
+
return predicate(expr);
|
|
319
|
+
}
|
|
320
|
+
function embeddingField(field) {
|
|
321
|
+
return {
|
|
322
|
+
...baseFieldBuilder(field),
|
|
323
|
+
similarTo: (queryEmbedding, k, options) => vectorSimilarity(field, queryEmbedding, k, options)
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function buildFieldBuilderForTypeInfo(field, typeInfo) {
|
|
327
|
+
if (!typeInfo) {
|
|
328
|
+
return baseField(field);
|
|
329
|
+
}
|
|
330
|
+
switch (typeInfo.valueType) {
|
|
331
|
+
case "string": {
|
|
332
|
+
return stringField(field);
|
|
333
|
+
}
|
|
334
|
+
case "number": {
|
|
335
|
+
return numberField(field);
|
|
336
|
+
}
|
|
337
|
+
case "boolean": {
|
|
338
|
+
return baseField(field);
|
|
339
|
+
}
|
|
340
|
+
case "date": {
|
|
341
|
+
return dateField(field);
|
|
342
|
+
}
|
|
343
|
+
case "array": {
|
|
344
|
+
return arrayField(field);
|
|
345
|
+
}
|
|
346
|
+
case "object": {
|
|
347
|
+
return objectField(field, { typeInfo });
|
|
348
|
+
}
|
|
349
|
+
case "embedding": {
|
|
350
|
+
return embeddingField(field);
|
|
351
|
+
}
|
|
352
|
+
case "unknown": {
|
|
353
|
+
return baseField(field);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
function resolvePointerTypeInfo(typeInfo, pointer) {
|
|
358
|
+
return chunk3E7SNSIA_cjs.resolveFieldTypeInfoAtJsonPointer(typeInfo, pointer);
|
|
359
|
+
}
|
|
360
|
+
function objectOp(op, field, pointer, value, options) {
|
|
361
|
+
const expr = {
|
|
362
|
+
__type: "object_op",
|
|
363
|
+
op,
|
|
364
|
+
field,
|
|
365
|
+
pointer,
|
|
366
|
+
...value !== void 0 && {
|
|
367
|
+
value: literal(coerceLiteralValue(value))
|
|
368
|
+
},
|
|
369
|
+
...options?.valueType !== void 0 && { valueType: options.valueType },
|
|
370
|
+
...options?.elementType !== void 0 && {
|
|
371
|
+
elementType: options.elementType
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
return predicate(expr);
|
|
375
|
+
}
|
|
376
|
+
function objectField(field, options) {
|
|
377
|
+
const basePointer = field.jsonPointer;
|
|
378
|
+
return {
|
|
379
|
+
...baseFieldBuilder(field),
|
|
380
|
+
get: (key) => {
|
|
381
|
+
const pointer = chunkFLRCVI2G_cjs.jsonPointer([key]);
|
|
382
|
+
const nestedPointer = chunkFLRCVI2G_cjs.joinJsonPointers(basePointer, pointer);
|
|
383
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, pointer);
|
|
384
|
+
const nestedRef = fieldRef(field.alias, field.path, {
|
|
385
|
+
jsonPointer: nestedPointer,
|
|
386
|
+
...resolved?.valueType !== void 0 && {
|
|
387
|
+
valueType: resolved.valueType
|
|
388
|
+
},
|
|
389
|
+
...resolved?.elementType !== void 0 && {
|
|
390
|
+
elementType: resolved.elementType
|
|
391
|
+
}
|
|
392
|
+
});
|
|
393
|
+
return buildFieldBuilderForTypeInfo(nestedRef, resolved);
|
|
394
|
+
},
|
|
395
|
+
hasKey: (key) => {
|
|
396
|
+
const pointer = chunkFLRCVI2G_cjs.jsonPointer([key]);
|
|
397
|
+
resolvePointerTypeInfo(options?.typeInfo, pointer);
|
|
398
|
+
return objectOp("hasKey", field, pointer);
|
|
399
|
+
},
|
|
400
|
+
hasPath: (pointer) => {
|
|
401
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
402
|
+
resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
403
|
+
return objectOp("hasPath", field, normalized);
|
|
404
|
+
},
|
|
405
|
+
pathEquals: (pointer, value) => {
|
|
406
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
407
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
408
|
+
if (resolved && (resolved.valueType === "array" || resolved.valueType === "object")) {
|
|
409
|
+
throw new Error("pathEquals is only supported for scalar JSON values");
|
|
410
|
+
}
|
|
411
|
+
const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
|
|
412
|
+
return objectOp("pathEquals", field, normalized, value, predicateOptions);
|
|
413
|
+
},
|
|
414
|
+
pathContains: (pointer, value) => {
|
|
415
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
416
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
417
|
+
if (resolved && resolved.valueType !== "array") {
|
|
418
|
+
throw new Error("pathContains is only supported for JSON array values");
|
|
419
|
+
}
|
|
420
|
+
const predicateOptions = resolved?.elementType === void 0 ? void 0 : { elementType: resolved.elementType };
|
|
421
|
+
return objectOp(
|
|
422
|
+
"pathContains",
|
|
423
|
+
field,
|
|
424
|
+
normalized,
|
|
425
|
+
value,
|
|
426
|
+
predicateOptions
|
|
427
|
+
);
|
|
428
|
+
},
|
|
429
|
+
pathIsNull: (pointer) => {
|
|
430
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
431
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
432
|
+
const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
|
|
433
|
+
return objectOp(
|
|
434
|
+
"pathIsNull",
|
|
435
|
+
field,
|
|
436
|
+
normalized,
|
|
437
|
+
void 0,
|
|
438
|
+
predicateOptions
|
|
439
|
+
);
|
|
440
|
+
},
|
|
441
|
+
pathIsNotNull: (pointer) => {
|
|
442
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
443
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
444
|
+
const predicateOptions = resolved?.valueType === void 0 ? void 0 : { valueType: resolved.valueType };
|
|
445
|
+
return objectOp(
|
|
446
|
+
"pathIsNotNull",
|
|
447
|
+
field,
|
|
448
|
+
normalized,
|
|
449
|
+
void 0,
|
|
450
|
+
predicateOptions
|
|
451
|
+
);
|
|
452
|
+
},
|
|
453
|
+
field: (pointer) => {
|
|
454
|
+
const normalized = chunkFLRCVI2G_cjs.normalizeJsonPointer(pointer);
|
|
455
|
+
const nestedPointer = chunkFLRCVI2G_cjs.joinJsonPointers(basePointer, normalized);
|
|
456
|
+
const resolved = resolvePointerTypeInfo(options?.typeInfo, normalized);
|
|
457
|
+
const nestedRef = fieldRef(field.alias, field.path, {
|
|
458
|
+
jsonPointer: nestedPointer,
|
|
459
|
+
...resolved?.valueType !== void 0 && {
|
|
460
|
+
valueType: resolved.valueType
|
|
461
|
+
},
|
|
462
|
+
...resolved?.elementType !== void 0 && {
|
|
463
|
+
elementType: resolved.elementType
|
|
464
|
+
}
|
|
465
|
+
});
|
|
466
|
+
return buildFieldBuilderForTypeInfo(nestedRef, resolved);
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
}
|
|
470
|
+
function exists(subquery) {
|
|
471
|
+
const expr = {
|
|
472
|
+
__type: "exists",
|
|
473
|
+
subquery,
|
|
474
|
+
negated: false
|
|
475
|
+
};
|
|
476
|
+
return predicate(expr);
|
|
477
|
+
}
|
|
478
|
+
function notExists(subquery) {
|
|
479
|
+
const expr = {
|
|
480
|
+
__type: "exists",
|
|
481
|
+
subquery,
|
|
482
|
+
negated: true
|
|
483
|
+
};
|
|
484
|
+
return predicate(expr);
|
|
485
|
+
}
|
|
486
|
+
function inSubquery(field, subquery) {
|
|
487
|
+
assertSingleColumnSubquery(subquery);
|
|
488
|
+
assertCompatibleSubqueryValueTypes(field, subquery);
|
|
489
|
+
const expr = {
|
|
490
|
+
__type: "in_subquery",
|
|
491
|
+
field,
|
|
492
|
+
subquery,
|
|
493
|
+
negated: false
|
|
494
|
+
};
|
|
495
|
+
return predicate(expr);
|
|
496
|
+
}
|
|
497
|
+
function notInSubquery(field, subquery) {
|
|
498
|
+
assertSingleColumnSubquery(subquery);
|
|
499
|
+
assertCompatibleSubqueryValueTypes(field, subquery);
|
|
500
|
+
const expr = {
|
|
501
|
+
__type: "in_subquery",
|
|
502
|
+
field,
|
|
503
|
+
subquery,
|
|
504
|
+
negated: true
|
|
505
|
+
};
|
|
506
|
+
return predicate(expr);
|
|
507
|
+
}
|
|
508
|
+
function assertSingleColumnSubquery(subquery) {
|
|
509
|
+
const columnCount = getSubqueryColumnCount(subquery);
|
|
510
|
+
if (columnCount === 1) return;
|
|
511
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
512
|
+
`IN/NOT IN subquery must project exactly 1 column, but got ${columnCount}`,
|
|
513
|
+
{ subqueryColumnCount: columnCount },
|
|
514
|
+
{
|
|
515
|
+
suggestion: "Use aggregate() with exactly one projected field for scalar IN/NOT IN subqueries."
|
|
516
|
+
}
|
|
517
|
+
);
|
|
518
|
+
}
|
|
519
|
+
function assertCompatibleSubqueryValueTypes(field, subquery) {
|
|
520
|
+
const fieldValueType = field.valueType;
|
|
521
|
+
const subqueryValueType = getSingleSubqueryColumnValueType(subquery);
|
|
522
|
+
const resolvedValueType = fieldValueType ?? subqueryValueType;
|
|
523
|
+
if (isUnsupportedInSubqueryValueType(resolvedValueType)) {
|
|
524
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
525
|
+
`IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,
|
|
526
|
+
{ valueType: resolvedValueType },
|
|
527
|
+
{
|
|
528
|
+
suggestion: "Use scalar fields (string/number/boolean/date) in IN/NOT IN predicates."
|
|
529
|
+
}
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
if (isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
536
|
+
`IN/NOT IN type mismatch: field type "${String(fieldValueType)}" does not match subquery column type "${String(subqueryValueType)}"`,
|
|
537
|
+
{
|
|
538
|
+
fieldValueType,
|
|
539
|
+
subqueryValueType
|
|
540
|
+
}
|
|
541
|
+
);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// src/backend/types.ts
|
|
545
|
+
function createBackendOverlay(target, overlay) {
|
|
546
|
+
const boundTargetMethods = /* @__PURE__ */ new Map();
|
|
547
|
+
function hasOverlayProperty(property) {
|
|
548
|
+
return Object.hasOwn(overlay, property);
|
|
549
|
+
}
|
|
550
|
+
function targetValue(targetObject, property) {
|
|
551
|
+
const value = Reflect.get(targetObject, property, targetObject);
|
|
552
|
+
if (typeof value !== "function") return value;
|
|
553
|
+
const cached = boundTargetMethods.get(property);
|
|
554
|
+
if (cached !== void 0) return cached;
|
|
555
|
+
const method = value;
|
|
556
|
+
const bound = method.bind(targetObject);
|
|
557
|
+
boundTargetMethods.set(property, bound);
|
|
558
|
+
return bound;
|
|
559
|
+
}
|
|
560
|
+
return new Proxy(target, {
|
|
561
|
+
get(targetObject, property) {
|
|
562
|
+
if (hasOverlayProperty(property)) {
|
|
563
|
+
return Reflect.get(overlay, property, overlay);
|
|
564
|
+
}
|
|
565
|
+
return targetValue(targetObject, property);
|
|
566
|
+
},
|
|
567
|
+
has(targetObject, property) {
|
|
568
|
+
return hasOverlayProperty(property) || Reflect.has(targetObject, property);
|
|
569
|
+
},
|
|
570
|
+
ownKeys(targetObject) {
|
|
571
|
+
return [
|
|
572
|
+
.../* @__PURE__ */ new Set([
|
|
573
|
+
...Reflect.ownKeys(targetObject),
|
|
574
|
+
...Reflect.ownKeys(overlay)
|
|
575
|
+
])
|
|
576
|
+
];
|
|
577
|
+
},
|
|
578
|
+
getOwnPropertyDescriptor(targetObject, property) {
|
|
579
|
+
if (hasOverlayProperty(property)) {
|
|
580
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(overlay, property);
|
|
581
|
+
if (descriptor === void 0) return;
|
|
582
|
+
return { ...descriptor, configurable: true };
|
|
583
|
+
}
|
|
584
|
+
return Reflect.getOwnPropertyDescriptor(targetObject, property);
|
|
585
|
+
},
|
|
586
|
+
set(targetObject, property, value) {
|
|
587
|
+
if (hasOverlayProperty(property)) {
|
|
588
|
+
return Reflect.set(overlay, property, value, overlay);
|
|
589
|
+
}
|
|
590
|
+
return Reflect.set(targetObject, property, value, targetObject);
|
|
591
|
+
},
|
|
592
|
+
defineProperty(targetObject, property, attributes) {
|
|
593
|
+
if (hasOverlayProperty(property)) {
|
|
594
|
+
return Reflect.defineProperty(overlay, property, attributes);
|
|
595
|
+
}
|
|
596
|
+
return Reflect.defineProperty(targetObject, property, attributes);
|
|
597
|
+
},
|
|
598
|
+
deleteProperty(targetObject, property) {
|
|
599
|
+
if (hasOverlayProperty(property)) {
|
|
600
|
+
return Reflect.deleteProperty(overlay, property);
|
|
601
|
+
}
|
|
602
|
+
return Reflect.deleteProperty(targetObject, property);
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
function wrapWithManagedClose(backend, teardown) {
|
|
607
|
+
let isClosed = false;
|
|
608
|
+
return createBackendOverlay(backend, {
|
|
609
|
+
async close() {
|
|
610
|
+
if (isClosed) return;
|
|
611
|
+
isClosed = true;
|
|
612
|
+
await backend.close();
|
|
613
|
+
await teardown();
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
async function runOptionallyInTransaction(backend, fn, fallback) {
|
|
618
|
+
if ("transaction" in backend && backend.capabilities.transactions) {
|
|
619
|
+
return backend.transaction((tx) => fn(tx));
|
|
620
|
+
}
|
|
621
|
+
return fn(fallback ?? backend);
|
|
622
|
+
}
|
|
623
|
+
var SQLITE_MAX_BIND_PARAMETERS = 999;
|
|
624
|
+
var POSTGRES_MAX_BIND_PARAMETERS = 65535;
|
|
625
|
+
var SQLITE_CAPABILITIES = {
|
|
626
|
+
transactions: true,
|
|
627
|
+
// SQLite supports transactions
|
|
628
|
+
windowFunctions: true,
|
|
629
|
+
// SQLite has supported window functions since 3.25.0
|
|
630
|
+
returning: true,
|
|
631
|
+
// SQLite has supported RETURNING since 3.35.0
|
|
632
|
+
maxBindParameters: SQLITE_MAX_BIND_PARAMETERS
|
|
633
|
+
};
|
|
634
|
+
var POSTGRES_CAPABILITIES = {
|
|
635
|
+
transactions: true,
|
|
636
|
+
// PostgreSQL supports transactions
|
|
637
|
+
windowFunctions: true,
|
|
638
|
+
// PostgreSQL supports ROW_NUMBER() and related windows
|
|
639
|
+
returning: true,
|
|
640
|
+
// PostgreSQL has supported RETURNING since 8.2
|
|
641
|
+
maxBindParameters: POSTGRES_MAX_BIND_PARAMETERS
|
|
642
|
+
};
|
|
643
|
+
var COMPARISON_OP_SQL = {
|
|
644
|
+
eq: "=",
|
|
645
|
+
neq: "!=",
|
|
646
|
+
gt: ">",
|
|
647
|
+
gte: ">=",
|
|
648
|
+
lt: "<",
|
|
649
|
+
lte: "<="
|
|
650
|
+
};
|
|
651
|
+
function compileFieldColumn(field, cteAlias, cteColumnPrefix) {
|
|
652
|
+
if (cteColumnPrefix !== void 0) {
|
|
653
|
+
const qualifier2 = cteColumnPrefix === "" ? "" : `${cteColumnPrefix}.`;
|
|
654
|
+
if (field.path.length === 1 && field.path[0] === "id") {
|
|
655
|
+
return drizzleOrm.sql.raw(`${qualifier2}id`);
|
|
656
|
+
}
|
|
657
|
+
if (field.path.length === 1 && field.path[0] === "kind") {
|
|
658
|
+
return drizzleOrm.sql.raw(`${qualifier2}kind`);
|
|
659
|
+
}
|
|
660
|
+
if (field.path.length > 0 && field.path[0] === "props") {
|
|
661
|
+
return drizzleOrm.sql.raw(`${qualifier2}props`);
|
|
662
|
+
}
|
|
663
|
+
return drizzleOrm.sql.raw(`${qualifier2}${field.path.join("_")}`);
|
|
664
|
+
}
|
|
665
|
+
const prefix = field.alias;
|
|
666
|
+
const qualifier = cteAlias ? `${cteAlias}.` : "";
|
|
667
|
+
if (field.path.length === 1 && field.path[0] === "id") {
|
|
668
|
+
return drizzleOrm.sql.raw(`${qualifier}${prefix}_id`);
|
|
669
|
+
}
|
|
670
|
+
if (field.path.length === 1 && field.path[0] === "kind") {
|
|
671
|
+
return drizzleOrm.sql.raw(`${qualifier}${prefix}_kind`);
|
|
672
|
+
}
|
|
673
|
+
if (field.path.length > 0 && field.path[0] === "props") {
|
|
674
|
+
return drizzleOrm.sql.raw(`${qualifier}${prefix}_props`);
|
|
675
|
+
}
|
|
676
|
+
return drizzleOrm.sql.raw(`${qualifier}${prefix}_${field.path.join("_")}`);
|
|
677
|
+
}
|
|
678
|
+
function getFieldPointer(field) {
|
|
679
|
+
if (field.jsonPointer !== void 0) {
|
|
680
|
+
return field.jsonPointer;
|
|
681
|
+
}
|
|
682
|
+
if (field.path.length > 1 && field.path[0] === "props") {
|
|
683
|
+
return chunkFLRCVI2G_cjs.jsonPointer(field.path.slice(1));
|
|
684
|
+
}
|
|
685
|
+
return void 0;
|
|
686
|
+
}
|
|
687
|
+
function isJsonField(field) {
|
|
688
|
+
return field.path.length > 0 && field.path[0] === "props";
|
|
689
|
+
}
|
|
690
|
+
function normalizeValueType2(valueType) {
|
|
691
|
+
if (!valueType || valueType === "unknown") {
|
|
692
|
+
return void 0;
|
|
693
|
+
}
|
|
694
|
+
return valueType;
|
|
695
|
+
}
|
|
696
|
+
function compileFieldValue(field, dialect, valueType, cteAlias, pointerOverride, cteColumnPrefix) {
|
|
697
|
+
const resolved = normalizeValueType2(valueType);
|
|
698
|
+
const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
|
|
699
|
+
if (!isJsonField(field)) {
|
|
700
|
+
return column;
|
|
701
|
+
}
|
|
702
|
+
const pointer = pointerOverride ?? getFieldPointer(field);
|
|
703
|
+
if (!pointer || pointer === "") {
|
|
704
|
+
return column;
|
|
705
|
+
}
|
|
706
|
+
switch (resolved) {
|
|
707
|
+
case "number": {
|
|
708
|
+
return dialect.jsonExtractNumber(column, pointer);
|
|
709
|
+
}
|
|
710
|
+
case "boolean": {
|
|
711
|
+
return dialect.jsonExtractBoolean(column, pointer);
|
|
712
|
+
}
|
|
713
|
+
case "date": {
|
|
714
|
+
return dialect.jsonExtractDate(column, pointer);
|
|
715
|
+
}
|
|
716
|
+
case "array":
|
|
717
|
+
case "object":
|
|
718
|
+
case "embedding": {
|
|
719
|
+
return dialect.jsonExtract(column, pointer);
|
|
720
|
+
}
|
|
721
|
+
case "string":
|
|
722
|
+
case "unknown":
|
|
723
|
+
case void 0: {
|
|
724
|
+
return dialect.jsonExtractText(column, pointer);
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
function compileFieldTextValue(field, dialect, cteAlias, pointerOverride, cteColumnPrefix) {
|
|
729
|
+
const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
|
|
730
|
+
if (!isJsonField(field)) {
|
|
731
|
+
return column;
|
|
732
|
+
}
|
|
733
|
+
const pointer = getFieldPointer(field);
|
|
734
|
+
if (!pointer || pointer === "") {
|
|
735
|
+
return column;
|
|
736
|
+
}
|
|
737
|
+
return dialect.jsonExtractText(column, pointer);
|
|
738
|
+
}
|
|
739
|
+
function compileFieldJsonValue(field, dialect, cteAlias, pointerOverride, cteColumnPrefix) {
|
|
740
|
+
const column = compileFieldColumn(field, cteAlias, cteColumnPrefix);
|
|
741
|
+
if (!isJsonField(field)) {
|
|
742
|
+
return column;
|
|
743
|
+
}
|
|
744
|
+
const pointer = pointerOverride ?? getFieldPointer(field);
|
|
745
|
+
if (!pointer || pointer === "") {
|
|
746
|
+
return column;
|
|
747
|
+
}
|
|
748
|
+
return dialect.jsonExtract(column, pointer);
|
|
749
|
+
}
|
|
750
|
+
function resolveLiteralValueTypes(literals) {
|
|
751
|
+
const resolved = /* @__PURE__ */ new Set();
|
|
752
|
+
for (const literal2 of literals) {
|
|
753
|
+
const valueType = normalizeValueType2(literal2.valueType);
|
|
754
|
+
if (valueType) {
|
|
755
|
+
resolved.add(valueType);
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
if (resolved.size > 1) {
|
|
759
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
760
|
+
"Mixed literal value types are not supported in predicates",
|
|
761
|
+
{ valueTypes: [...resolved] }
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
return resolved.values().next().value;
|
|
765
|
+
}
|
|
766
|
+
function resolveComparisonValueType(field, right) {
|
|
767
|
+
if (isParameterRef(right)) {
|
|
768
|
+
return normalizeValueType2(right.valueType) ?? normalizeValueType2(field.valueType);
|
|
769
|
+
}
|
|
770
|
+
const literals = Array.isArray(right) ? right : [right];
|
|
771
|
+
const literalType = resolveLiteralValueTypes(literals);
|
|
772
|
+
const fieldType = normalizeValueType2(field.valueType);
|
|
773
|
+
if (fieldType === "date" && literalType === "string") {
|
|
774
|
+
return fieldType;
|
|
775
|
+
}
|
|
776
|
+
if (literalType) {
|
|
777
|
+
return literalType;
|
|
778
|
+
}
|
|
779
|
+
return fieldType;
|
|
780
|
+
}
|
|
781
|
+
function resolvePredicateValueType(preferred, literal2) {
|
|
782
|
+
const normalizedPreferred = normalizeValueType2(preferred);
|
|
783
|
+
if (normalizedPreferred) {
|
|
784
|
+
return normalizedPreferred;
|
|
785
|
+
}
|
|
786
|
+
return literal2 ? normalizeValueType2(literal2.valueType) : void 0;
|
|
787
|
+
}
|
|
788
|
+
function convertValueForSql(value, dialect) {
|
|
789
|
+
return dialect.bindValue(value);
|
|
790
|
+
}
|
|
791
|
+
function compileStringPattern(op, pattern) {
|
|
792
|
+
const escaped = pattern.replaceAll("%", String.raw`\%`).replaceAll("_", String.raw`\_`);
|
|
793
|
+
switch (op) {
|
|
794
|
+
case "contains": {
|
|
795
|
+
return `%${escaped}%`;
|
|
796
|
+
}
|
|
797
|
+
case "startsWith": {
|
|
798
|
+
return `${escaped}%`;
|
|
799
|
+
}
|
|
800
|
+
case "endsWith": {
|
|
801
|
+
return `%${escaped}`;
|
|
802
|
+
}
|
|
803
|
+
case "like":
|
|
804
|
+
case "ilike": {
|
|
805
|
+
return pattern;
|
|
806
|
+
}
|
|
807
|
+
default: {
|
|
808
|
+
return escaped;
|
|
809
|
+
}
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
function escapeLikePatternParameter(parameter) {
|
|
813
|
+
return drizzleOrm.sql`REPLACE(REPLACE(REPLACE(${parameter}, '\\', '\\\\'), '%', '\\%'), '_', '\\_')`;
|
|
814
|
+
}
|
|
815
|
+
function compileParameterizedStringPattern(op, parameter) {
|
|
816
|
+
switch (op) {
|
|
817
|
+
case "contains": {
|
|
818
|
+
const escaped = escapeLikePatternParameter(parameter);
|
|
819
|
+
return drizzleOrm.sql`'%' || ${escaped} || '%'`;
|
|
820
|
+
}
|
|
821
|
+
case "startsWith": {
|
|
822
|
+
const escaped = escapeLikePatternParameter(parameter);
|
|
823
|
+
return drizzleOrm.sql`${escaped} || '%'`;
|
|
824
|
+
}
|
|
825
|
+
case "endsWith": {
|
|
826
|
+
const escaped = escapeLikePatternParameter(parameter);
|
|
827
|
+
return drizzleOrm.sql`'%' || ${escaped}`;
|
|
828
|
+
}
|
|
829
|
+
case "like":
|
|
830
|
+
case "ilike": {
|
|
831
|
+
return parameter;
|
|
832
|
+
}
|
|
833
|
+
default: {
|
|
834
|
+
return escapeLikePatternParameter(parameter);
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
function compilePredicateExpression(expr, ctx) {
|
|
839
|
+
const { dialect } = ctx;
|
|
840
|
+
const cteColumnPrefix = ctx.cteColumnPrefix;
|
|
841
|
+
switch (expr.__type) {
|
|
842
|
+
case "comparison": {
|
|
843
|
+
return compileComparisonPredicate(expr, dialect, cteColumnPrefix);
|
|
844
|
+
}
|
|
845
|
+
case "string_op": {
|
|
846
|
+
const field = compileFieldTextValue(
|
|
847
|
+
expr.field,
|
|
848
|
+
dialect,
|
|
849
|
+
void 0,
|
|
850
|
+
void 0,
|
|
851
|
+
cteColumnPrefix
|
|
852
|
+
);
|
|
853
|
+
if (isParameterRef(expr.pattern)) {
|
|
854
|
+
const placeholder = drizzleOrm.sql`${drizzleOrm.sql.placeholder(expr.pattern.name)}`;
|
|
855
|
+
const pattern2 = compileParameterizedStringPattern(expr.op, placeholder);
|
|
856
|
+
if (expr.op === "ilike" || expr.op === "contains" || expr.op === "startsWith" || expr.op === "endsWith") {
|
|
857
|
+
return dialect.ilike(field, pattern2);
|
|
858
|
+
}
|
|
859
|
+
return drizzleOrm.sql`${field} LIKE ${pattern2}`;
|
|
860
|
+
}
|
|
861
|
+
const pattern = compileStringPattern(expr.op, expr.pattern);
|
|
862
|
+
if (expr.op === "ilike" || expr.op === "contains" || expr.op === "startsWith" || expr.op === "endsWith") {
|
|
863
|
+
return dialect.ilike(field, pattern);
|
|
864
|
+
}
|
|
865
|
+
return drizzleOrm.sql`${field} LIKE ${pattern}`;
|
|
866
|
+
}
|
|
867
|
+
case "null_check": {
|
|
868
|
+
const field = compileFieldTextValue(
|
|
869
|
+
expr.field,
|
|
870
|
+
dialect,
|
|
871
|
+
void 0,
|
|
872
|
+
void 0,
|
|
873
|
+
cteColumnPrefix
|
|
874
|
+
);
|
|
875
|
+
return expr.op === "isNull" ? drizzleOrm.sql`${field} IS NULL` : drizzleOrm.sql`${field} IS NOT NULL`;
|
|
876
|
+
}
|
|
877
|
+
case "between": {
|
|
878
|
+
const lowerIsParam = isParameterRef(expr.lower);
|
|
879
|
+
const upperIsParam = isParameterRef(expr.upper);
|
|
880
|
+
const boundsForType = [];
|
|
881
|
+
if (!lowerIsParam) boundsForType.push(expr.lower);
|
|
882
|
+
if (!upperIsParam) boundsForType.push(expr.upper);
|
|
883
|
+
const valueType = boundsForType.length > 0 ? resolveComparisonValueType(expr.field, boundsForType) : normalizeValueType2(expr.field.valueType);
|
|
884
|
+
if (valueType === "array" || valueType === "object") {
|
|
885
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
886
|
+
"Between comparisons are not supported for JSON arrays or objects"
|
|
887
|
+
);
|
|
888
|
+
}
|
|
889
|
+
const field = compileFieldValue(
|
|
890
|
+
expr.field,
|
|
891
|
+
dialect,
|
|
892
|
+
valueType,
|
|
893
|
+
void 0,
|
|
894
|
+
void 0,
|
|
895
|
+
cteColumnPrefix
|
|
896
|
+
);
|
|
897
|
+
const lower = lowerIsParam ? drizzleOrm.sql.placeholder(expr.lower.name) : convertValueForSql(expr.lower.value, dialect);
|
|
898
|
+
const upper = upperIsParam ? drizzleOrm.sql.placeholder(expr.upper.name) : convertValueForSql(expr.upper.value, dialect);
|
|
899
|
+
return drizzleOrm.sql`${field} BETWEEN ${lower} AND ${upper}`;
|
|
900
|
+
}
|
|
901
|
+
case "and": {
|
|
902
|
+
const parts = expr.predicates.map(
|
|
903
|
+
(p) => compilePredicateExpression(p, ctx)
|
|
904
|
+
);
|
|
905
|
+
return drizzleOrm.sql`(${drizzleOrm.sql.join(parts, drizzleOrm.sql` AND `)})`;
|
|
906
|
+
}
|
|
907
|
+
case "or": {
|
|
908
|
+
const parts = expr.predicates.map(
|
|
909
|
+
(p) => compilePredicateExpression(p, ctx)
|
|
910
|
+
);
|
|
911
|
+
return drizzleOrm.sql`(${drizzleOrm.sql.join(parts, drizzleOrm.sql` OR `)})`;
|
|
912
|
+
}
|
|
913
|
+
case "not": {
|
|
914
|
+
const inner = compilePredicateExpression(expr.predicate, ctx);
|
|
915
|
+
return drizzleOrm.sql`NOT (${inner})`;
|
|
916
|
+
}
|
|
917
|
+
case "array_op": {
|
|
918
|
+
return compileArrayPredicate(expr, dialect, cteColumnPrefix);
|
|
919
|
+
}
|
|
920
|
+
case "object_op": {
|
|
921
|
+
return compileObjectPredicate(expr, dialect, cteColumnPrefix);
|
|
922
|
+
}
|
|
923
|
+
case "aggregate_comparison": {
|
|
924
|
+
return compileAggregatePredicate(expr, dialect);
|
|
925
|
+
}
|
|
926
|
+
case "exists": {
|
|
927
|
+
return compileExistsSubquery(expr, ctx);
|
|
928
|
+
}
|
|
929
|
+
case "in_subquery": {
|
|
930
|
+
return compileInSubquery(expr, ctx);
|
|
931
|
+
}
|
|
932
|
+
case "vector_similarity":
|
|
933
|
+
case "fulltext_match": {
|
|
934
|
+
return STRUCTURAL_PREDICATE_NOOP;
|
|
935
|
+
}
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
var STRUCTURAL_PREDICATE_NOOP = drizzleOrm.sql.raw("1=1");
|
|
939
|
+
function compileComparisonPredicate(expr, dialect, cteColumnPrefix) {
|
|
940
|
+
if (isParameterRef(expr.right)) {
|
|
941
|
+
const parameterValueType = normalizeValueType2(expr.right.valueType) ?? normalizeValueType2(expr.left.valueType);
|
|
942
|
+
const left2 = compileFieldValue(
|
|
943
|
+
expr.left,
|
|
944
|
+
dialect,
|
|
945
|
+
parameterValueType,
|
|
946
|
+
void 0,
|
|
947
|
+
void 0,
|
|
948
|
+
cteColumnPrefix
|
|
949
|
+
);
|
|
950
|
+
const opSql2 = COMPARISON_OP_SQL[expr.op];
|
|
951
|
+
if (!opSql2) {
|
|
952
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
953
|
+
`Comparison operation "${expr.op}" is not supported for parameterized predicates`
|
|
954
|
+
);
|
|
955
|
+
}
|
|
956
|
+
return drizzleOrm.sql`${left2} ${drizzleOrm.sql.raw(opSql2)} ${drizzleOrm.sql.placeholder(expr.right.name)}`;
|
|
957
|
+
}
|
|
958
|
+
const valueType = resolveComparisonValueType(expr.left, expr.right);
|
|
959
|
+
if (valueType === "array" || valueType === "object") {
|
|
960
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
961
|
+
`Comparison operation "${expr.op}" is not supported for ${valueType} values`
|
|
962
|
+
);
|
|
963
|
+
}
|
|
964
|
+
const left = compileFieldValue(
|
|
965
|
+
expr.left,
|
|
966
|
+
dialect,
|
|
967
|
+
valueType,
|
|
968
|
+
void 0,
|
|
969
|
+
void 0,
|
|
970
|
+
cteColumnPrefix
|
|
971
|
+
);
|
|
972
|
+
if (expr.op === "in" || expr.op === "notIn") {
|
|
973
|
+
const values = Array.isArray(expr.right) ? expr.right : [expr.right];
|
|
974
|
+
if (values.length === 0) {
|
|
975
|
+
return expr.op === "in" ? drizzleOrm.sql.raw("1=0") : drizzleOrm.sql.raw("1=1");
|
|
976
|
+
}
|
|
977
|
+
const placeholders = values.map(
|
|
978
|
+
(v) => drizzleOrm.sql`${convertValueForSql(v.value, dialect)}`
|
|
979
|
+
);
|
|
980
|
+
const op = expr.op === "in" ? drizzleOrm.sql.raw("IN") : drizzleOrm.sql.raw("NOT IN");
|
|
981
|
+
return drizzleOrm.sql`${left} ${op} (${drizzleOrm.sql.join(placeholders, drizzleOrm.sql`, `)})`;
|
|
982
|
+
}
|
|
983
|
+
const right = expr.right;
|
|
984
|
+
const rightValue = Array.isArray(right) ? right[0] : right;
|
|
985
|
+
const convertedRight = convertValueForSql(rightValue.value, dialect);
|
|
986
|
+
const opSql = COMPARISON_OP_SQL[expr.op];
|
|
987
|
+
if (!opSql) {
|
|
988
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
989
|
+
`Comparison operation "${expr.op}" is not supported`
|
|
990
|
+
);
|
|
991
|
+
}
|
|
992
|
+
return drizzleOrm.sql`${left} ${drizzleOrm.sql.raw(opSql)} ${convertedRight}`;
|
|
993
|
+
}
|
|
994
|
+
function compileArrayPredicate(expr, dialect, cteColumnPrefix) {
|
|
995
|
+
const field = compileFieldJsonValue(
|
|
996
|
+
expr.field,
|
|
997
|
+
dialect,
|
|
998
|
+
void 0,
|
|
999
|
+
void 0,
|
|
1000
|
+
cteColumnPrefix
|
|
1001
|
+
);
|
|
1002
|
+
const values = expr.values?.map((v) => convertValueForSql(v.value, dialect)) ?? [];
|
|
1003
|
+
switch (expr.op) {
|
|
1004
|
+
case "isEmpty": {
|
|
1005
|
+
return drizzleOrm.sql`(${field} IS NULL OR ${dialect.jsonArrayLength(field)} = 0)`;
|
|
1006
|
+
}
|
|
1007
|
+
case "isNotEmpty": {
|
|
1008
|
+
return drizzleOrm.sql`(${field} IS NOT NULL AND ${dialect.jsonArrayLength(field)} > 0)`;
|
|
1009
|
+
}
|
|
1010
|
+
case "lengthEq": {
|
|
1011
|
+
return drizzleOrm.sql`${dialect.jsonArrayLength(field)} = ${expr.length}`;
|
|
1012
|
+
}
|
|
1013
|
+
case "lengthGt": {
|
|
1014
|
+
return drizzleOrm.sql`${dialect.jsonArrayLength(field)} > ${expr.length}`;
|
|
1015
|
+
}
|
|
1016
|
+
case "lengthGte": {
|
|
1017
|
+
return drizzleOrm.sql`${dialect.jsonArrayLength(field)} >= ${expr.length}`;
|
|
1018
|
+
}
|
|
1019
|
+
case "lengthLt": {
|
|
1020
|
+
return drizzleOrm.sql`${dialect.jsonArrayLength(field)} < ${expr.length}`;
|
|
1021
|
+
}
|
|
1022
|
+
case "lengthLte": {
|
|
1023
|
+
return drizzleOrm.sql`${dialect.jsonArrayLength(field)} <= ${expr.length}`;
|
|
1024
|
+
}
|
|
1025
|
+
case "contains": {
|
|
1026
|
+
const value = values[0];
|
|
1027
|
+
if (value === void 0) {
|
|
1028
|
+
return drizzleOrm.sql.raw("1=0");
|
|
1029
|
+
}
|
|
1030
|
+
return dialect.jsonArrayContains(field, value);
|
|
1031
|
+
}
|
|
1032
|
+
case "containsAll": {
|
|
1033
|
+
return dialect.jsonArrayContainsAll(field, values);
|
|
1034
|
+
}
|
|
1035
|
+
case "containsAny": {
|
|
1036
|
+
return dialect.jsonArrayContainsAny(field, values);
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
}
|
|
1040
|
+
function compileObjectPredicate(expr, dialect, cteColumnPrefix) {
|
|
1041
|
+
const basePointer = getFieldPointer(expr.field);
|
|
1042
|
+
const pointer = chunkFLRCVI2G_cjs.joinJsonPointers(basePointer, expr.pointer);
|
|
1043
|
+
const column = compileFieldColumn(expr.field, void 0, cteColumnPrefix);
|
|
1044
|
+
switch (expr.op) {
|
|
1045
|
+
case "hasKey":
|
|
1046
|
+
case "hasPath": {
|
|
1047
|
+
return dialect.jsonHasPath(column, pointer);
|
|
1048
|
+
}
|
|
1049
|
+
case "pathEquals": {
|
|
1050
|
+
if (!expr.value) {
|
|
1051
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1052
|
+
"pathEquals requires a comparison value"
|
|
1053
|
+
);
|
|
1054
|
+
}
|
|
1055
|
+
const valueType = resolvePredicateValueType(expr.valueType, expr.value);
|
|
1056
|
+
if (valueType === "array" || valueType === "object") {
|
|
1057
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1058
|
+
"pathEquals is not supported for JSON arrays or objects"
|
|
1059
|
+
);
|
|
1060
|
+
}
|
|
1061
|
+
const left = compileFieldValue(
|
|
1062
|
+
expr.field,
|
|
1063
|
+
dialect,
|
|
1064
|
+
valueType,
|
|
1065
|
+
void 0,
|
|
1066
|
+
pointer,
|
|
1067
|
+
cteColumnPrefix
|
|
1068
|
+
);
|
|
1069
|
+
return drizzleOrm.sql`${left} = ${convertValueForSql(expr.value.value, dialect)}`;
|
|
1070
|
+
}
|
|
1071
|
+
case "pathContains": {
|
|
1072
|
+
if (!expr.value) {
|
|
1073
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1074
|
+
"pathContains requires a comparison value"
|
|
1075
|
+
);
|
|
1076
|
+
}
|
|
1077
|
+
const arrayField2 = compileFieldJsonValue(
|
|
1078
|
+
expr.field,
|
|
1079
|
+
dialect,
|
|
1080
|
+
void 0,
|
|
1081
|
+
pointer,
|
|
1082
|
+
cteColumnPrefix
|
|
1083
|
+
);
|
|
1084
|
+
return dialect.jsonArrayContains(
|
|
1085
|
+
arrayField2,
|
|
1086
|
+
convertValueForSql(expr.value.value, dialect)
|
|
1087
|
+
);
|
|
1088
|
+
}
|
|
1089
|
+
case "pathIsNull": {
|
|
1090
|
+
return dialect.jsonPathIsNull(column, pointer);
|
|
1091
|
+
}
|
|
1092
|
+
case "pathIsNotNull": {
|
|
1093
|
+
return dialect.jsonPathIsNotNull(column, pointer);
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
}
|
|
1097
|
+
function compileAggregatePredicate(expr, dialect) {
|
|
1098
|
+
const aggregate = compileAggregateExpr(expr.aggregate, dialect);
|
|
1099
|
+
const op = COMPARISON_OP_SQL[expr.op];
|
|
1100
|
+
if (!op) {
|
|
1101
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1102
|
+
`Comparison operation "${expr.op}" is not supported for aggregate predicates`
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
const convertedValue = convertValueForSql(expr.value.value, dialect);
|
|
1106
|
+
return drizzleOrm.sql`${aggregate} ${drizzleOrm.sql.raw(op)} ${convertedValue}`;
|
|
1107
|
+
}
|
|
1108
|
+
function compileAggregateExpr(expr, dialect) {
|
|
1109
|
+
const cteAlias = `cte_${expr.field.alias}`;
|
|
1110
|
+
const field = compileFieldValue(
|
|
1111
|
+
expr.field,
|
|
1112
|
+
dialect,
|
|
1113
|
+
expr.field.valueType,
|
|
1114
|
+
cteAlias
|
|
1115
|
+
);
|
|
1116
|
+
switch (expr.function) {
|
|
1117
|
+
case "count": {
|
|
1118
|
+
return drizzleOrm.sql`COUNT(${field})`;
|
|
1119
|
+
}
|
|
1120
|
+
case "countDistinct": {
|
|
1121
|
+
return drizzleOrm.sql`COUNT(DISTINCT ${field})`;
|
|
1122
|
+
}
|
|
1123
|
+
case "sum": {
|
|
1124
|
+
return drizzleOrm.sql`SUM(${field})`;
|
|
1125
|
+
}
|
|
1126
|
+
case "avg": {
|
|
1127
|
+
return drizzleOrm.sql`AVG(${field})`;
|
|
1128
|
+
}
|
|
1129
|
+
case "min": {
|
|
1130
|
+
return drizzleOrm.sql`MIN(${field})`;
|
|
1131
|
+
}
|
|
1132
|
+
case "max": {
|
|
1133
|
+
return drizzleOrm.sql`MAX(${field})`;
|
|
1134
|
+
}
|
|
1135
|
+
default: {
|
|
1136
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1137
|
+
`Unknown aggregate function: ${expr.function}`
|
|
1138
|
+
);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
function compileExistsSubquery(expr, ctx) {
|
|
1143
|
+
if (expr.subquery.graphId === void 0) {
|
|
1144
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError("EXISTS subquery must have a graphId");
|
|
1145
|
+
}
|
|
1146
|
+
const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);
|
|
1147
|
+
return expr.negated ? drizzleOrm.sql`NOT EXISTS (${subSql})` : drizzleOrm.sql`EXISTS (${subSql})`;
|
|
1148
|
+
}
|
|
1149
|
+
function compileInSubquery(expr, ctx) {
|
|
1150
|
+
const subqueryColumnCount = getSubqueryColumnCount(expr.subquery);
|
|
1151
|
+
if (subqueryColumnCount !== 1) {
|
|
1152
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1153
|
+
`IN/NOT IN subquery must project exactly 1 column, but got ${subqueryColumnCount}`,
|
|
1154
|
+
{ subqueryColumnCount }
|
|
1155
|
+
);
|
|
1156
|
+
}
|
|
1157
|
+
const fieldValueType = normalizeValueType2(expr.field.valueType);
|
|
1158
|
+
const subqueryValueType = getSingleSubqueryColumnValueType(expr.subquery);
|
|
1159
|
+
const resolvedValueType = fieldValueType ?? subqueryValueType;
|
|
1160
|
+
if (isUnsupportedInSubqueryValueType(resolvedValueType)) {
|
|
1161
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1162
|
+
`IN/NOT IN subquery does not support ${String(resolvedValueType)} values`,
|
|
1163
|
+
{ valueType: resolvedValueType }
|
|
1164
|
+
);
|
|
1165
|
+
}
|
|
1166
|
+
if (!isInSubqueryTypeCompatible(fieldValueType, subqueryValueType)) {
|
|
1167
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1168
|
+
`IN/NOT IN type mismatch: field type "${String(fieldValueType)}" does not match subquery column type "${String(subqueryValueType)}"`,
|
|
1169
|
+
{
|
|
1170
|
+
fieldValueType,
|
|
1171
|
+
subqueryValueType
|
|
1172
|
+
}
|
|
1173
|
+
);
|
|
1174
|
+
}
|
|
1175
|
+
const valueType = fieldValueType ?? subqueryValueType;
|
|
1176
|
+
if (expr.subquery.graphId === void 0) {
|
|
1177
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(
|
|
1178
|
+
"IN/NOT IN subquery must have a graphId"
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
1181
|
+
const fieldSql = compileFieldValue(
|
|
1182
|
+
expr.field,
|
|
1183
|
+
ctx.dialect,
|
|
1184
|
+
valueType,
|
|
1185
|
+
void 0,
|
|
1186
|
+
void 0,
|
|
1187
|
+
ctx.cteColumnPrefix
|
|
1188
|
+
);
|
|
1189
|
+
const subSql = ctx.compileQuery(expr.subquery, expr.subquery.graphId);
|
|
1190
|
+
return expr.negated ? drizzleOrm.sql`${fieldSql} NOT IN (${subSql})` : drizzleOrm.sql`${fieldSql} IN (${subSql})`;
|
|
1191
|
+
}
|
|
1192
|
+
function extractStructuralPredicates(predicates, isMatch, rejectionMessage) {
|
|
1193
|
+
const results = [];
|
|
1194
|
+
function visit(expr, inDisallowedBranch) {
|
|
1195
|
+
if (isMatch(expr)) {
|
|
1196
|
+
if (inDisallowedBranch) {
|
|
1197
|
+
throw new chunkJIEJCTDS_cjs.UnsupportedPredicateError(rejectionMessage);
|
|
1198
|
+
}
|
|
1199
|
+
results.push(expr);
|
|
1200
|
+
return;
|
|
1201
|
+
}
|
|
1202
|
+
switch (expr.__type) {
|
|
1203
|
+
case "and": {
|
|
1204
|
+
for (const child of expr.predicates) visit(child, inDisallowedBranch);
|
|
1205
|
+
return;
|
|
1206
|
+
}
|
|
1207
|
+
case "or": {
|
|
1208
|
+
for (const child of expr.predicates) visit(child, true);
|
|
1209
|
+
return;
|
|
1210
|
+
}
|
|
1211
|
+
case "not": {
|
|
1212
|
+
visit(expr.predicate, true);
|
|
1213
|
+
return;
|
|
1214
|
+
}
|
|
1215
|
+
case "comparison":
|
|
1216
|
+
case "string_op":
|
|
1217
|
+
case "null_check":
|
|
1218
|
+
case "between":
|
|
1219
|
+
case "array_op":
|
|
1220
|
+
case "object_op":
|
|
1221
|
+
case "aggregate_comparison":
|
|
1222
|
+
case "exists":
|
|
1223
|
+
case "in_subquery":
|
|
1224
|
+
case "vector_similarity":
|
|
1225
|
+
case "fulltext_match": {
|
|
1226
|
+
return;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
}
|
|
1230
|
+
for (const pred of predicates) visit(pred.expression, false);
|
|
1231
|
+
return results;
|
|
1232
|
+
}
|
|
1233
|
+
function extractVectorSimilarityPredicates(predicates) {
|
|
1234
|
+
return extractStructuralPredicates(
|
|
1235
|
+
predicates,
|
|
1236
|
+
(expr) => expr.__type === "vector_similarity",
|
|
1237
|
+
"Vector similarity predicates cannot be nested under OR or NOT. Use top-level AND combinations instead."
|
|
1238
|
+
);
|
|
1239
|
+
}
|
|
1240
|
+
function extractFulltextMatchPredicates(predicates) {
|
|
1241
|
+
return extractStructuralPredicates(
|
|
1242
|
+
predicates,
|
|
1243
|
+
(expr) => expr.__type === "fulltext_match",
|
|
1244
|
+
"Fulltext match predicates cannot be nested under OR or NOT. Use top-level AND combinations instead."
|
|
1245
|
+
);
|
|
1246
|
+
}
|
|
1247
|
+
var EMPTY_PREDICATES = [];
|
|
1248
|
+
function sqlValueList(values) {
|
|
1249
|
+
return drizzleOrm.sql.join(
|
|
1250
|
+
values.map((value) => drizzleOrm.sql`${value}`),
|
|
1251
|
+
drizzleOrm.sql`, `
|
|
1252
|
+
);
|
|
1253
|
+
}
|
|
1254
|
+
function buildPredicateIndexKey(alias, targetType) {
|
|
1255
|
+
return `${alias}\0${targetType}`;
|
|
1256
|
+
}
|
|
1257
|
+
function resolvePredicateTargetType(predicate2) {
|
|
1258
|
+
return predicate2.targetType === "edge" ? "edge" : "node";
|
|
1259
|
+
}
|
|
1260
|
+
function buildPredicateIndex(ast) {
|
|
1261
|
+
const byAliasAndType = /* @__PURE__ */ new Map();
|
|
1262
|
+
for (const predicate2 of ast.predicates) {
|
|
1263
|
+
const key = buildPredicateIndexKey(
|
|
1264
|
+
predicate2.targetAlias,
|
|
1265
|
+
resolvePredicateTargetType(predicate2)
|
|
1266
|
+
);
|
|
1267
|
+
const existing = byAliasAndType.get(key);
|
|
1268
|
+
if (existing === void 0) {
|
|
1269
|
+
byAliasAndType.set(key, [predicate2]);
|
|
1270
|
+
} else {
|
|
1271
|
+
existing.push(predicate2);
|
|
1272
|
+
}
|
|
1273
|
+
}
|
|
1274
|
+
return { byAliasAndType };
|
|
1275
|
+
}
|
|
1276
|
+
function getPredicatesForAlias(predicateIndex, alias, targetType) {
|
|
1277
|
+
return predicateIndex.byAliasAndType.get(
|
|
1278
|
+
buildPredicateIndexKey(alias, targetType)
|
|
1279
|
+
) ?? EMPTY_PREDICATES;
|
|
1280
|
+
}
|
|
1281
|
+
function compilePredicateClauses(predicates, predicateContext) {
|
|
1282
|
+
return predicates.map(
|
|
1283
|
+
(predicate2) => compilePredicateExpression(predicate2.expression, predicateContext)
|
|
1284
|
+
);
|
|
1285
|
+
}
|
|
1286
|
+
function compileKindFilter(column, kinds) {
|
|
1287
|
+
if (kinds.length === 0) {
|
|
1288
|
+
return drizzleOrm.sql`1 = 0`;
|
|
1289
|
+
}
|
|
1290
|
+
if (kinds.length === 1) {
|
|
1291
|
+
return drizzleOrm.sql`${column} = ${kinds[0]}`;
|
|
1292
|
+
}
|
|
1293
|
+
return drizzleOrm.sql`${column} IN (${sqlValueList(kinds)})`;
|
|
1294
|
+
}
|
|
1295
|
+
function getNodeKindsForAlias(ast, alias) {
|
|
1296
|
+
if (alias === ast.start.alias) {
|
|
1297
|
+
return ast.start.kinds;
|
|
1298
|
+
}
|
|
1299
|
+
for (const traversal of ast.traversals) {
|
|
1300
|
+
if (traversal.nodeAlias === alias) {
|
|
1301
|
+
return traversal.nodeKinds;
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
throw new chunkJIEJCTDS_cjs.CompilerInvariantError(`Unknown traversal source alias: ${alias}`);
|
|
1305
|
+
}
|
|
1306
|
+
function getHybridTargetAlias(vectorPredicate, fulltextPredicate) {
|
|
1307
|
+
if (!vectorPredicate || !fulltextPredicate) return void 0;
|
|
1308
|
+
return vectorPredicate.field.alias === fulltextPredicate.field.alias ? vectorPredicate.field.alias : void 0;
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
// src/backend/drizzle/row-mappers.ts
|
|
1312
|
+
function requireTimestamp(value, field) {
|
|
1313
|
+
if (value === void 0) {
|
|
1314
|
+
throw new chunkJIEJCTDS_cjs.DatabaseOperationError(
|
|
1315
|
+
`Expected non-null ${field} timestamp`,
|
|
1316
|
+
{ operation: "select", entity: "row" }
|
|
1317
|
+
);
|
|
1318
|
+
}
|
|
1319
|
+
return value;
|
|
1320
|
+
}
|
|
1321
|
+
function asString(value, field) {
|
|
1322
|
+
if (typeof value !== "string") {
|
|
1323
|
+
throw new chunkJIEJCTDS_cjs.DatabaseOperationError(
|
|
1324
|
+
`Expected ${field} to be string, got ${typeof value}`,
|
|
1325
|
+
{ operation: "select", entity: "row" }
|
|
1326
|
+
);
|
|
1327
|
+
}
|
|
1328
|
+
return value;
|
|
1329
|
+
}
|
|
1330
|
+
function asNumber(value, field) {
|
|
1331
|
+
if (typeof value !== "number") {
|
|
1332
|
+
throw new chunkJIEJCTDS_cjs.DatabaseOperationError(
|
|
1333
|
+
`Expected ${field} to be number, got ${typeof value}`,
|
|
1334
|
+
{ operation: "select", entity: "row" }
|
|
1335
|
+
);
|
|
1336
|
+
}
|
|
1337
|
+
return value;
|
|
1338
|
+
}
|
|
1339
|
+
function nowIso() {
|
|
1340
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
1341
|
+
}
|
|
1342
|
+
function nullToUndefined(value) {
|
|
1343
|
+
return value ?? void 0;
|
|
1344
|
+
}
|
|
1345
|
+
function formatPostgresTimestamp(value) {
|
|
1346
|
+
if (value === null || value === void 0) return void 0;
|
|
1347
|
+
if (value instanceof Date) return value.toISOString();
|
|
1348
|
+
if (typeof value === "string") {
|
|
1349
|
+
if (value.includes("T")) return value;
|
|
1350
|
+
const date = new Date(value);
|
|
1351
|
+
if (!Number.isNaN(date.getTime())) return date.toISOString();
|
|
1352
|
+
return value;
|
|
1353
|
+
}
|
|
1354
|
+
return void 0;
|
|
1355
|
+
}
|
|
1356
|
+
function coerceNumericScore(value) {
|
|
1357
|
+
if (typeof value === "number") return value;
|
|
1358
|
+
const parsed = Number.parseFloat(value);
|
|
1359
|
+
if (Number.isNaN(parsed)) {
|
|
1360
|
+
throw new TypeError(
|
|
1361
|
+
`Backend returned non-numeric fulltext score: ${JSON.stringify(value)}`
|
|
1362
|
+
);
|
|
1363
|
+
}
|
|
1364
|
+
return parsed;
|
|
1365
|
+
}
|
|
1366
|
+
function normalizeJsonColumn(value) {
|
|
1367
|
+
return typeof value === "string" ? value : JSON.stringify(value ?? {});
|
|
1368
|
+
}
|
|
1369
|
+
var SQLITE_ROW_MAPPER_CONFIG = {
|
|
1370
|
+
formatTimestamp: (value) => {
|
|
1371
|
+
if (value === null || value === void 0) return;
|
|
1372
|
+
if (typeof value !== "string") {
|
|
1373
|
+
throw new chunkJIEJCTDS_cjs.DatabaseOperationError(
|
|
1374
|
+
`Expected timestamp to be string, got ${typeof value}`,
|
|
1375
|
+
{ operation: "select", entity: "row" }
|
|
1376
|
+
);
|
|
1377
|
+
}
|
|
1378
|
+
return value;
|
|
1379
|
+
},
|
|
1380
|
+
normalizeJson: (value) => {
|
|
1381
|
+
if (typeof value !== "string") {
|
|
1382
|
+
throw new chunkJIEJCTDS_cjs.DatabaseOperationError(
|
|
1383
|
+
`Expected JSON column to be string, got ${typeof value}`,
|
|
1384
|
+
{ operation: "select", entity: "row" }
|
|
1385
|
+
);
|
|
1386
|
+
}
|
|
1387
|
+
return value;
|
|
1388
|
+
}
|
|
1389
|
+
};
|
|
1390
|
+
var POSTGRES_ROW_MAPPER_CONFIG = {
|
|
1391
|
+
formatTimestamp: formatPostgresTimestamp,
|
|
1392
|
+
normalizeJson: normalizeJsonColumn
|
|
1393
|
+
};
|
|
1394
|
+
function createNodeRowMapper(config) {
|
|
1395
|
+
return (row) => ({
|
|
1396
|
+
graph_id: asString(row.graph_id, "graph_id"),
|
|
1397
|
+
kind: asString(row.kind, "kind"),
|
|
1398
|
+
id: asString(row.id, "id"),
|
|
1399
|
+
props: config.normalizeJson(row.props),
|
|
1400
|
+
version: asNumber(row.version, "version"),
|
|
1401
|
+
valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),
|
|
1402
|
+
valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),
|
|
1403
|
+
created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
|
|
1404
|
+
updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), "updated_at"),
|
|
1405
|
+
deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
function createEdgeRowMapper(config) {
|
|
1409
|
+
return (row) => ({
|
|
1410
|
+
graph_id: asString(row.graph_id, "graph_id"),
|
|
1411
|
+
id: asString(row.id, "id"),
|
|
1412
|
+
kind: asString(row.kind, "kind"),
|
|
1413
|
+
from_kind: asString(row.from_kind, "from_kind"),
|
|
1414
|
+
from_id: asString(row.from_id, "from_id"),
|
|
1415
|
+
to_kind: asString(row.to_kind, "to_kind"),
|
|
1416
|
+
to_id: asString(row.to_id, "to_id"),
|
|
1417
|
+
props: config.normalizeJson(row.props),
|
|
1418
|
+
valid_from: nullToUndefined(config.formatTimestamp(row.valid_from)),
|
|
1419
|
+
valid_to: nullToUndefined(config.formatTimestamp(row.valid_to)),
|
|
1420
|
+
created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
|
|
1421
|
+
updated_at: requireTimestamp(config.formatTimestamp(row.updated_at), "updated_at"),
|
|
1422
|
+
deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
|
|
1423
|
+
});
|
|
1424
|
+
}
|
|
1425
|
+
function createUniqueRowMapper(config) {
|
|
1426
|
+
return (row) => ({
|
|
1427
|
+
graph_id: asString(row.graph_id, "graph_id"),
|
|
1428
|
+
node_kind: asString(row.node_kind, "node_kind"),
|
|
1429
|
+
constraint_name: asString(row.constraint_name, "constraint_name"),
|
|
1430
|
+
key: asString(row.key, "key"),
|
|
1431
|
+
node_id: asString(row.node_id, "node_id"),
|
|
1432
|
+
concrete_kind: asString(row.concrete_kind, "concrete_kind"),
|
|
1433
|
+
deleted_at: nullToUndefined(config.formatTimestamp(row.deleted_at))
|
|
1434
|
+
});
|
|
1435
|
+
}
|
|
1436
|
+
function createSchemaVersionRowMapper(config) {
|
|
1437
|
+
return (row) => {
|
|
1438
|
+
const isActiveValue = row.is_active;
|
|
1439
|
+
const isActive = isActiveValue === true || isActiveValue === 1 || isActiveValue === "1";
|
|
1440
|
+
return {
|
|
1441
|
+
graph_id: asString(row.graph_id, "graph_id"),
|
|
1442
|
+
version: asNumber(row.version, "version"),
|
|
1443
|
+
schema_hash: asString(row.schema_hash, "schema_hash"),
|
|
1444
|
+
schema_doc: config.normalizeJson(row.schema_doc),
|
|
1445
|
+
created_at: requireTimestamp(config.formatTimestamp(row.created_at), "created_at"),
|
|
1446
|
+
is_active: isActive
|
|
1447
|
+
};
|
|
1448
|
+
};
|
|
1449
|
+
}
|
|
1450
|
+
|
|
1451
|
+
// src/utils/array.ts
|
|
1452
|
+
function chunk(items, size) {
|
|
1453
|
+
if (!Number.isSafeInteger(size) || size < 1) {
|
|
1454
|
+
throw new RangeError(`chunk size must be a positive integer, got: ${size}`);
|
|
1455
|
+
}
|
|
1456
|
+
if (items.length === 0) return [];
|
|
1457
|
+
if (items.length <= size) return [items];
|
|
1458
|
+
const chunks = [];
|
|
1459
|
+
for (let start = 0; start < items.length; start += size) {
|
|
1460
|
+
chunks.push(items.slice(start, start + size));
|
|
1461
|
+
}
|
|
1462
|
+
return chunks;
|
|
1463
|
+
}
|
|
1464
|
+
function groupBy(items, keyFor) {
|
|
1465
|
+
const groups = /* @__PURE__ */ new Map();
|
|
1466
|
+
for (const item of items) {
|
|
1467
|
+
const key = keyFor(item);
|
|
1468
|
+
const group = groups.get(key) ?? [];
|
|
1469
|
+
group.push(item);
|
|
1470
|
+
groups.set(key, group);
|
|
1471
|
+
}
|
|
1472
|
+
return groups;
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
// src/utils/presence.ts
|
|
1476
|
+
function isPresent(value) {
|
|
1477
|
+
return value !== null && value !== void 0;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1480
|
+
exports.POSTGRES_CAPABILITIES = POSTGRES_CAPABILITIES;
|
|
1481
|
+
exports.POSTGRES_MAX_BIND_PARAMETERS = POSTGRES_MAX_BIND_PARAMETERS;
|
|
1482
|
+
exports.POSTGRES_ROW_MAPPER_CONFIG = POSTGRES_ROW_MAPPER_CONFIG;
|
|
1483
|
+
exports.SQLITE_CAPABILITIES = SQLITE_CAPABILITIES;
|
|
1484
|
+
exports.SQLITE_MAX_BIND_PARAMETERS = SQLITE_MAX_BIND_PARAMETERS;
|
|
1485
|
+
exports.SQLITE_ROW_MAPPER_CONFIG = SQLITE_ROW_MAPPER_CONFIG;
|
|
1486
|
+
exports.arrayField = arrayField;
|
|
1487
|
+
exports.baseField = baseField;
|
|
1488
|
+
exports.buildFieldBuilderForTypeInfo = buildFieldBuilderForTypeInfo;
|
|
1489
|
+
exports.buildPredicateIndex = buildPredicateIndex;
|
|
1490
|
+
exports.chunk = chunk;
|
|
1491
|
+
exports.coerceNumericScore = coerceNumericScore;
|
|
1492
|
+
exports.compileFieldValue = compileFieldValue;
|
|
1493
|
+
exports.compileKindFilter = compileKindFilter;
|
|
1494
|
+
exports.compilePredicateClauses = compilePredicateClauses;
|
|
1495
|
+
exports.compilePredicateExpression = compilePredicateExpression;
|
|
1496
|
+
exports.createBackendOverlay = createBackendOverlay;
|
|
1497
|
+
exports.createEdgeRowMapper = createEdgeRowMapper;
|
|
1498
|
+
exports.createFulltextAccessor = createFulltextAccessor;
|
|
1499
|
+
exports.createNodeRowMapper = createNodeRowMapper;
|
|
1500
|
+
exports.createSchemaVersionRowMapper = createSchemaVersionRowMapper;
|
|
1501
|
+
exports.createUniqueRowMapper = createUniqueRowMapper;
|
|
1502
|
+
exports.dateField = dateField;
|
|
1503
|
+
exports.exists = exists;
|
|
1504
|
+
exports.extractFulltextMatchPredicates = extractFulltextMatchPredicates;
|
|
1505
|
+
exports.extractVectorSimilarityPredicates = extractVectorSimilarityPredicates;
|
|
1506
|
+
exports.fieldRef = fieldRef;
|
|
1507
|
+
exports.formatPostgresTimestamp = formatPostgresTimestamp;
|
|
1508
|
+
exports.getHybridTargetAlias = getHybridTargetAlias;
|
|
1509
|
+
exports.getNodeKindsForAlias = getNodeKindsForAlias;
|
|
1510
|
+
exports.getPredicatesForAlias = getPredicatesForAlias;
|
|
1511
|
+
exports.groupBy = groupBy;
|
|
1512
|
+
exports.inSubquery = inSubquery;
|
|
1513
|
+
exports.isParameterRef = isParameterRef;
|
|
1514
|
+
exports.isPresent = isPresent;
|
|
1515
|
+
exports.notExists = notExists;
|
|
1516
|
+
exports.notInSubquery = notInSubquery;
|
|
1517
|
+
exports.nowIso = nowIso;
|
|
1518
|
+
exports.numberField = numberField;
|
|
1519
|
+
exports.objectField = objectField;
|
|
1520
|
+
exports.param = param;
|
|
1521
|
+
exports.runOptionallyInTransaction = runOptionallyInTransaction;
|
|
1522
|
+
exports.sqlValueList = sqlValueList;
|
|
1523
|
+
exports.stringField = stringField;
|
|
1524
|
+
exports.wrapWithManagedClose = wrapWithManagedClose;
|
|
1525
|
+
//# sourceMappingURL=chunk-I4W7MKVG.cjs.map
|
|
1526
|
+
//# sourceMappingURL=chunk-I4W7MKVG.cjs.map
|