MCPcopy Create free account
hub / github.com/zenstackhq/zenstack / flattenCompoundUniqueFilters

Function flattenCompoundUniqueFilters

packages/orm/src/client/query-utils.ts:396–438  ·  view source on GitHub ↗
(schema: SchemaDef, model: string, filter: unknown)

Source from the content-addressed store, hash-verified

394 * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`
395 */
396export 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
440export function ensureArray<T>(value: T | T[]): T[] {
441 if (Array.isArray(value)) {

Callers 2

buildFilterFunction · 0.90

Calls 1

getUniqueFieldsFunction · 0.70

Tested by

no test coverage detected