(schema: SchemaDef, model: string, filter: unknown)
| 394 | * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }` |
| 395 | */ |
| 396 | export function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) { |
| 397 | if (typeof filter !== 'object' || !filter) { |
| 398 | return filter; |
| 399 | } |
| 400 | |
| 401 | const uniqueFields = getUniqueFields(schema, model); |
| 402 | const compoundUniques = uniqueFields.filter((u) => 'defs' in u); |
| 403 | if (compoundUniques.length === 0) { |
| 404 | return filter; |
| 405 | } |
| 406 | |
| 407 | const flattenedResult: any = {}; |
| 408 | const restFilter: any = {}; |
| 409 | |
| 410 | for (const [key, value] of Object.entries(filter)) { |
| 411 | if (compoundUniques.some(({ name }) => name === key)) { |
| 412 | // flatten the compound field |
| 413 | Object.assign(flattenedResult, value); |
| 414 | } else { |
| 415 | restFilter[key] = value; |
| 416 | } |
| 417 | } |
| 418 | |
| 419 | if (Object.keys(flattenedResult).length === 0) { |
| 420 | // nothing flattened |
| 421 | return filter; |
| 422 | } else if (Object.keys(restFilter).length === 0) { |
| 423 | // all flattened |
| 424 | return flattenedResult; |
| 425 | } else { |
| 426 | const flattenedKeys = Object.keys(flattenedResult); |
| 427 | const restKeys = Object.keys(restFilter); |
| 428 | if (flattenedKeys.some((k) => restKeys.includes(k))) { |
| 429 | // keys overlap, cannot merge directly, build an AND clause |
| 430 | return { |
| 431 | AND: [flattenedResult, restFilter], |
| 432 | }; |
| 433 | } else { |
| 434 | // safe to merge directly |
| 435 | return { ...flattenedResult, ...restFilter }; |
| 436 | } |
| 437 | } |
| 438 | } |
| 439 | |
| 440 | export function ensureArray<T>(value: T | T[]): T[] { |
| 441 | if (Array.isArray(value)) { |
no test coverage detected