(x: FilterR, relation?: string)
| 209 | } |
| 210 | |
| 211 | const statement = (x: FilterR, relation?: string): string => { |
| 212 | const resolvedPath = x.path === idKey ? "id" : x.path |
| 213 | const k = fieldExpr(resolvedPath, relation) |
| 214 | |
| 215 | switch (x.op) { |
| 216 | case "in": { |
| 217 | const vals = x.value as unknown as readonly unknown[] |
| 218 | const hasNull = vals.some((v) => v == null) |
| 219 | const nonNullVals = vals.filter((v) => v != null) |
| 220 | const parts: string[] = [] |
| 221 | if (nonNullVals.length > 0) { |
| 222 | const placeholders = nonNullVals.map((v) => addParam(v)) |
| 223 | parts.push(`${k} IN (${placeholders.join(", ")})`) |
| 224 | } |
| 225 | if (hasNull) parts.push(`${k} IS NULL`) |
| 226 | return parts.length > 1 ? `(${parts.join(" OR ")})` : parts[0] ?? "1=0" |
| 227 | } |
| 228 | case "notIn": { |
| 229 | const vals = x.value as unknown as readonly unknown[] |
| 230 | const hasNull = vals.some((v) => v == null) |
| 231 | const nonNullVals = vals.filter((v) => v != null) |
| 232 | const parts: string[] = [] |
| 233 | if (nonNullVals.length > 0) { |
| 234 | const placeholders = nonNullVals.map((v) => addParam(v)) |
| 235 | parts.push(`${k} NOT IN (${placeholders.join(", ")})`) |
| 236 | } |
| 237 | if (hasNull) parts.push(`${k} IS NOT NULL`) |
| 238 | return parts.length > 1 ? `(${parts.join(" AND ")})` : parts[0] ?? "1=1" |
| 239 | } |
| 240 | |
| 241 | case "includes": { |
| 242 | const arrPath = dottedToJsonPath(resolvedPath) |
| 243 | const v = addParam(x.value) |
| 244 | return dialect.jsonArrayContains(arrPath, v) |
| 245 | } |
| 246 | case "notIncludes": { |
| 247 | const arrPath = dottedToJsonPath(resolvedPath) |
| 248 | const v = addParam(x.value) |
| 249 | return dialect.jsonArrayNotContains(arrPath, v) |
| 250 | } |
| 251 | |
| 252 | case "includes-any": { |
| 253 | const arrPath = dottedToJsonPath(resolvedPath) |
| 254 | const vals = x.value as unknown as readonly unknown[] |
| 255 | const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v))) |
| 256 | return dialect.jsonArrayContainsAny(arrPath, placeholders) |
| 257 | } |
| 258 | case "notIncludes-any": { |
| 259 | const arrPath = dottedToJsonPath(resolvedPath) |
| 260 | const vals = x.value as unknown as readonly unknown[] |
| 261 | const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v))) |
| 262 | return dialect.jsonArrayNotContainsAny(arrPath, placeholders) |
| 263 | } |
| 264 | |
| 265 | case "includes-all": { |
| 266 | const arrPath = dottedToJsonPath(resolvedPath) |
| 267 | const vals = x.value as unknown as readonly unknown[] |
| 268 | const placeholders = vals.map((v) => addParam(dialect.serializeJsonValue(v))) |
no test coverage detected
searching dependent graphs…