nestjs-query-mikro-orm 0.1.2 → 0.1.3
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/index.cjs +35 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +36 -3
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/query/where.builder.ts","../src/lib/query/filter-query.builder.ts","../src/lib/query/comparison.builder.ts","../src/lib/query/relation-query.builder.ts","../src/lib/query/aggregate.builder.ts","../src/lib/services/relation-query.service.ts","../src/lib/services/mikro-orm-query.service.ts","../src/lib/providers.ts","../src/lib/nest-query-mikro-orm.module.ts"],"names":["WhereBuilder","build","filter","and","or","conditions","length","andConditions","map","f","push","$and","orConditions","$or","fieldConditions","buildFieldComparisons","Object","keys","KNOWN_OPERATORS","Set","isComparisonObject","obj","Array","isArray","some","key","has","toLowerCase","result","forEach","field","comparison","buildComparison","operators","operator","value","mikroOrmOp","mapOperator","assign","normalizedOp","$eq","$ne","$gt","$gte","$lt","$lte","$like","$not","$ilike","$in","$nin","Error","JSON","stringify","isBetweenValue","lower","upper","val","FilterQueryBuilder","repo","whereBuilder","buildFindOptions","query","mikroOrmFilter","filterQuery","paging","sorting","limit","undefined","offset","options","orderBy","reduce","acc","direction","nulls","order","orderValue","replace","applyFilter","qb","_alias","andWhere","applySorting","sorts","applyGroupBy","groupBy","applyAggregateSorting","createQueryBuilder","alias","getEntityAlias","em","getEntityManager","meta","getMetadata","get","getEntityName","className","filterHasRelations","getReferencedRelations","relationNames","referencedFields","getFilterFields","includes","getReferencedRelationsRecursive","metadataOrFilter","metadata","actualFilter","from","prev","curr","currFilterValue","subFilter","merge","getReferencedRelationsRecursiveInternal","referencedRelation","relations","find","r","name","nestedFilter","targetMeta","type","nestedRelations","ComparisonBuilder","cmp","normalizedCmp","isComparison","isNotComparison","checkNonEmptyArray","betweenComparison","notBetweenComparison","isBetweenVal","RelationQueryBuilder","filterQueryBuilder","relation","relationMeta","getRelationMeta","relationRepo","getRepository","selectAndExecute","entity","RelationEntity","baseWhere","buildWhereCondition","finalWhere","findOptions","count","aggregate","aggregateQuery","rows","aggs","makeAggKey","func","makeGroupKey","records","isNumeric","v","Date","out","computeField","fn","values","nums","getTime","Number","n","isNaN","sum","s","every","Math","max","a","b","String","min","avg","groups","Map","keyParts","g","join","arr","set","groupRows","parts","split","p","parse","i","entityMeta","relationEntityMeta","entityPrimaryKey","primaryKeys","relationPrimaryKey","entityId","kind","fkValue","entityAsRecord","fkFieldName","fieldNames","conventionalIdField","relationNameLower","entityKeys","matchingKey","keyLower","endsWith","base","relationValue","owner","joinColumns","inversedBy","mappedBy","relationProp","properties","entityIndexColName","getRelationPrimaryKeysPropertyNameAndColumnsName","pk","prop","propertyName","columnName","AGG_REGEXP","AggregateBuilder","buildSelectExpressions","groupBySelects","col","getGroupByAlias","funcSelects","fields","aliases","getAggregateAlias","selects","BadRequestException","asyncConvertToAggregateResponse","responsePromise","aggResponse","convertToAggregateResponse","getAggregateSelects","getAggregateGroupBySelects","getAggregateFuncSelects","cols","rawAggregates","response","agg","_id","idObj","k","m","exec","resultField","matchResult","matchedFunc","matchedFieldName","funcKey","aggFunc","fieldName","getColumnName","mainAlias","createGroupBySelect","createAggSelect","selectExpr","selectAlias","addSelect","raw","RelationQueryService","queryRelations","RelationClass","relationName","dto","batchQueryRelations","isRelationClassIdentity","relationQueryBuilder","getRelationQueryBuilder","assembler","AssemblerFactory","getAssembler","getRelationEntity","convertToDTOs","convertQuery","aggregateRelations","batchAggregateRelations","rawResults","convertAggregateQuery","res","convertAggregateResponse","countRelations","batchCountRelations","findRelation","opts","batchFindRelations","relationEntity","convertToDTO","addRelations","id","relationIds","getById","getRelations","relationFilter","foundAllRelations","EntityClass","wrap","flush","collection","add","setRelations","currentRelations","nextSet","getPrimaryKey","currentRelation","currentPk","init","setRelation","relationId","removeRelations","remove","removeRelation","assignData","ownDescriptor","getOwnPropertyDescriptor","protoDescriptor","getPrototypeOf","descriptor","canAssignFk","Boolean","writable","entities","bypassAssembler","convertedQuery","results","Promise","all","relationDtos","dtos","batchResults","class","ids","relationMetadata","primaryKey","idFilter","additionalFilter","size","MikroOrmQueryService","useSoftDelete","where","deletedFilter","deletedAt","findById","additional","findOne","NotFoundException","createOne","record","ensureIsEntityAndDoesNotExist","persist","createMany","updateOne","update","dateWithClearUndefined","fromEntries","entries","ensureIdIsNotPresent","updateMany","updatedCount","deleteOne","deleteMany","deletedCount","restoreOne","ensureSoftDeleteEnabled","whereClause","additionalWhere","filters","restoreMany","e","create","ensureEntityDoesNotExist","clear","found","MethodNotAllowedException","createMikroOrmQueryServiceProvider","contextName","provide","getQueryServiceToken","useFactory","inject","getRepositoryToken","createMikroOrmQueryServiceProviders","NestjsQueryMikroOrmModule","forFeature","queryServiceProviders","mikroOrmModule","MikroOrmModule","imports","module","providers","exports"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FilterQuery } from '@mikro-orm/core';\nimport type {\n CommonFieldComparisonBetweenType,\n Filter,\n FilterComparisons,\n FilterFieldComparison,\n} from '@ptc-org/nestjs-query-core';\n\n/**\n * @internal\n * Builds a WHERE clause from a Filter for MikroORM.\n */\nexport class WhereBuilder<Entity> {\n /**\n * Builds a MikroORM FilterQuery from a nestjs-query Filter.\n * @param filter - the filter to build the WHERE clause from.\n */\n build(filter: Filter<Entity>): FilterQuery<Entity> {\n const { and, or } = filter;\n const conditions: FilterQuery<Entity>[] = [];\n\n // Handle AND conditions\n if (and && and.length) {\n const andConditions = and.map((f) => this.build(f as Filter<Entity>));\n conditions.push({ $and: andConditions } as FilterQuery<Entity>);\n }\n\n // Handle OR conditions\n if (or && or.length) {\n const orConditions = or.map((f) => this.build(f as Filter<Entity>));\n conditions.push({ $or: orConditions } as FilterQuery<Entity>);\n }\n\n // Handle field comparisons\n const fieldConditions = this.buildFieldComparisons(filter);\n if (Object.keys(fieldConditions).length > 0) {\n conditions.push(fieldConditions);\n }\n\n // Combine all conditions with $and if there are multiple\n if (conditions.length === 0) {\n return {} as FilterQuery<Entity>;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return { $and: conditions } as FilterQuery<Entity>;\n }\n\n /**\n * Known nestjs-query comparison operators\n */\n private readonly KNOWN_OPERATORS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'notlike',\n 'ilike',\n 'notilike',\n 'in',\n 'notin',\n 'is',\n 'isnot',\n 'between',\n 'notbetween',\n ]);\n\n /**\n * Check if an object contains comparison operators (not nested relation filters)\n */\n private isComparisonObject(obj: unknown): obj is FilterFieldComparison<unknown> {\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n const keys = Object.keys(obj);\n // If the object has any known operator keys, treat it as a comparison\n return keys.some((key) => this.KNOWN_OPERATORS.has(key.toLowerCase()));\n }\n\n /**\n * Creates field comparisons from a filter. This method will ignore and/or properties.\n * @param filter - the filter with fields to create comparisons for.\n */\n private buildFieldComparisons(filter: Filter<Entity>): FilterQuery<Entity> {\n const result: Record<string, unknown> = {};\n\n Object.keys(filter).forEach((field) => {\n if (field !== 'and' && field !== 'or') {\n const comparison = (filter as FilterComparisons<Entity>)[\n field as keyof FilterComparisons<Entity>\n ] as FilterFieldComparison<unknown>;\n\n if (comparison) {\n // Check if this is a nested relation filter (object without known operators)\n if (typeof comparison === 'object' && !this.isComparisonObject(comparison)) {\n // This is a nested relation filter - recursively build it\n result[field] = this.build(comparison as unknown as Filter<Entity>);\n } else {\n result[field] = this.buildComparison(comparison);\n }\n }\n }\n });\n\n return result as FilterQuery<Entity>;\n }\n\n /**\n * Builds a MikroORM comparison from a nestjs-query FilterFieldComparison.\n * @param comparison - the comparison to convert.\n */\n private buildComparison<T>(comparison: FilterFieldComparison<T>): Record<string, unknown> {\n const conditions: Record<string, unknown> = {};\n\n const operators = Object.keys(comparison) as (keyof FilterFieldComparison<T>)[];\n\n for (const operator of operators) {\n const value = comparison[operator];\n const mikroOrmOp = this.mapOperator(operator as string, value);\n Object.assign(conditions, mikroOrmOp);\n }\n\n // If there are multiple conditions, combine with $and\n if (Object.keys(conditions).length === 1) {\n return conditions;\n }\n\n return conditions;\n }\n\n /**\n * Maps a nestjs-query operator to a MikroORM operator.\n * @param operator - the nestjs-query operator.\n * @param value - the value to compare.\n */\n private mapOperator(operator: string, value: unknown): Record<string, unknown> {\n const normalizedOp = operator.toLowerCase();\n\n switch (normalizedOp) {\n case 'eq':\n return { $eq: value };\n case 'neq':\n return { $ne: value };\n case 'gt':\n return { $gt: value };\n case 'gte':\n return { $gte: value };\n case 'lt':\n return { $lt: value };\n case 'lte':\n return { $lte: value };\n case 'like':\n return { $like: value };\n case 'notlike':\n // MikroORM doesn't have a $nlike operator, but $not can be used at the field level\n // However, for relation filtering, this syntax may not work\n // Use $re with regex negation if needed, or return as $not: $like\n // Actually, SQLite supports NOT LIKE directly, so we'll use a raw approach\n return { $not: { $like: value } };\n case 'ilike':\n return { $ilike: value };\n case 'notilike':\n return { $not: { $ilike: value } };\n case 'in':\n return { $in: value };\n case 'notin':\n return { $nin: value };\n case 'is':\n if (value === null) {\n return { $eq: null };\n }\n if (value === true) {\n return { $eq: true };\n }\n if (value === false) {\n return { $eq: false };\n }\n throw new Error(`Unexpected is operator param ${JSON.stringify(value)}`);\n case 'isnot':\n if (value === null) {\n return { $ne: null };\n }\n if (value === true) {\n return { $ne: true };\n }\n if (value === false) {\n return { $ne: false };\n }\n throw new Error(`Unexpected isNot operator param ${JSON.stringify(value)}`);\n case 'between':\n if (this.isBetweenValue(value)) {\n return { $gte: value.lower, $lte: value.upper };\n }\n throw new Error(\n `Invalid value for between expected {lower: val, upper: val} got ${JSON.stringify(value)}`,\n );\n case 'notbetween':\n if (this.isBetweenValue(value)) {\n return {\n $or: [{ $lt: value.lower }, { $gt: value.upper }],\n };\n }\n throw new Error(\n `Invalid value for not between expected {lower: val, upper: val} got ${JSON.stringify(value)}`,\n );\n default:\n throw new Error(`Unknown operator ${operator}`);\n }\n }\n\n private isBetweenValue(val: unknown): val is CommonFieldComparisonBetweenType<unknown> {\n return val !== null && typeof val === 'object' && 'lower' in val && 'upper' in val;\n }\n}\n","import type { EntityMetadata, EntityName, EntityRepository, FilterQuery } from '@mikro-orm/core';\nimport type { Filter, Query, SortField } from '@ptc-org/nestjs-query-core';\nimport { getFilterFields } from '@ptc-org/nestjs-query-core';\nimport merge from 'lodash.merge';\n\nimport { WhereBuilder } from './where.builder';\nimport type { QueryBuilder } from './types';\n\n/**\n * @internal\n *\n * Nested record type\n */\nexport interface NestedRecord<E = unknown> {\n [keys: string]: NestedRecord<E>;\n}\n\n/**\n * @internal\n *\n * Class that will convert a Query into a MikroORM Query Builder.\n */\nexport class FilterQueryBuilder<Entity extends object> {\n constructor(\n readonly repo: EntityRepository<Entity>,\n readonly whereBuilder: WhereBuilder<Entity> = new WhereBuilder<Entity>(),\n ) {}\n\n /**\n * NOTE: QueryBuilder-specific helpers removed; use `buildFindOptions` to\n * produce a filter and options for `em.find`/`repo.find`.\n */\n\n /**\n * Build a filter query and find options suitable for `em.find`/`repo.find` calls.\n * This keeps usage DB-agnostic by returning plain filter objects and options\n * instead of driver-specific QueryBuilder instances.\n */\n buildFindOptions(query: Query<Entity>): {\n filterQuery?: FilterQuery<Entity>;\n options?: { limit?: number; offset?: number; orderBy?: Record<string, unknown> };\n } {\n const result: {\n filterQuery?: FilterQuery<Entity>;\n options?: { limit?: number; offset?: number; orderBy?: Record<string, unknown> };\n } = {};\n\n if (query.filter) {\n const mikroOrmFilter = this.whereBuilder.build(query.filter) as FilterQuery<Entity>;\n result.filterQuery = mikroOrmFilter;\n }\n\n const paging = query.paging;\n const sorting = query.sorting;\n\n if (\n (paging && (paging.limit !== undefined || paging.offset !== undefined)) ||\n (sorting && sorting.length)\n ) {\n const options: { limit?: number; offset?: number; orderBy?: Record<string, unknown> } = {};\n if (paging) {\n if (paging.limit !== undefined) options.limit = paging.limit;\n if (paging.offset !== undefined) options.offset = paging.offset;\n }\n if (sorting && sorting.length > 0) {\n const orderBy = sorting.reduce(\n (acc, { field, direction, nulls }) => {\n const order = direction === 'ASC' ? 'asc' : 'desc';\n let orderValue: string | object = order;\n\n if (nulls) {\n orderValue = `${order} ${nulls.toLowerCase().replace('_', ' ')}`;\n }\n\n return { ...acc, [field]: orderValue };\n },\n {} as Record<string, unknown>,\n );\n options.orderBy = orderBy;\n }\n result.options = options;\n }\n\n return result;\n }\n\n /**\n * Applies the filter from a Query to a MikroORM QueryBuilder.\n *\n * @param qb - the MikroORM QueryBuilder.\n * @param filter - the filter.\n * @param _alias - optional alias to use to qualify an identifier (unused in MikroORM)\n */\n applyFilter<Q extends QueryBuilder<Entity>>(qb: Q, filter?: Filter<Entity>, _alias?: string): Q {\n if (!filter) {\n return qb;\n }\n const mikroOrmFilter = this.whereBuilder.build(filter);\n return qb.andWhere!(mikroOrmFilter as FilterQuery<Entity>) as Q;\n }\n\n /**\n * Applies the ORDER BY clause to a MikroORM QueryBuilder.\n * @param qb - the MikroORM QueryBuilder.\n * @param sorts - an array of SortFields to create the ORDER BY clause.\n * @param _alias - optional alias to use to qualify an identifier (unused in MikroORM)\n */\n applySorting<Q extends QueryBuilder<Entity>>(\n qb: Q,\n sorts?: SortField<Entity>[],\n _alias?: string,\n ): Q {\n if (!sorts || sorts.length === 0) {\n return qb;\n }\n\n const orderBy = sorts.reduce(\n (acc, { field, direction, nulls }) => {\n const order = direction === 'ASC' ? 'asc' : 'desc';\n let orderValue: string | object = order;\n\n if (nulls) {\n orderValue = `${order} ${nulls.toLowerCase().replace('_', ' ')}`;\n }\n\n return { ...acc, [field]: orderValue };\n },\n {} as Record<string, unknown>,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return qb.orderBy!(orderBy as any) as Q;\n }\n\n applyGroupBy<Q extends QueryBuilder<Entity>>(\n qb: Q,\n groupBy?: (keyof Entity)[],\n _alias?: string,\n ): Q {\n if (!groupBy || groupBy.length === 0) {\n return qb;\n }\n\n groupBy.forEach((field) => {\n qb.groupBy!(field as string);\n });\n\n return qb;\n }\n\n applyAggregateSorting<Q extends QueryBuilder<Entity>>(\n qb: Q,\n groupBy?: (keyof Entity)[],\n _alias?: string,\n ): Q {\n if (!groupBy || groupBy.length === 0) {\n return qb;\n }\n\n const orderBy = groupBy.reduce(\n (acc, field) => ({\n ...acc,\n [field]: 'asc',\n }),\n {} as Record<string, string>,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return qb.orderBy!(orderBy as any) as Q;\n }\n\n /**\n * Create a MikroORM QueryBuilder.\n */\n private createQueryBuilder(alias?: string): QueryBuilder<Entity> {\n // `EntityRepository` typings may vary across MikroORM packages; use `any` at\n // the callsite to access the runtime helper without a hard dependency on\n // driver's repository type declarations.\n return (\n this.repo as unknown as { createQueryBuilder?: (alias?: string) => QueryBuilder<Entity> }\n ).createQueryBuilder?.(alias) as QueryBuilder<Entity>;\n }\n\n /**\n * Gets the entity alias based on the entity name.\n */\n private getEntityAlias(): string {\n const em = this.repo.getEntityManager();\n const meta = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return meta.className;\n }\n\n /**\n * Checks if a filter references any relations.\n * @param filter\n * @private\n *\n * @returns true if there are any referenced relations\n */\n filterHasRelations(filter?: Filter<Entity>): boolean {\n if (!filter) {\n return false;\n }\n return this.getReferencedRelations(filter).length > 0;\n }\n\n private getReferencedRelations(filter: Filter<Entity>): string[] {\n const relationNames = this.relationNames;\n const referencedFields = getFilterFields(filter);\n return referencedFields.filter((f) => relationNames.includes(f));\n }\n\n getReferencedRelationsRecursive(\n metadataOrFilter: EntityMetadata<Entity> | Filter<unknown> = {},\n filter?: Filter<unknown>,\n ): NestedRecord {\n const em = this.repo.getEntityManager();\n // Handle both signatures: (metadata, filter) and (filter)\n let metadata: EntityMetadata<Entity>;\n let actualFilter: Filter<unknown>;\n\n if (filter !== undefined) {\n // Called as (metadata, filter)\n metadata = metadataOrFilter as EntityMetadata<Entity>;\n actualFilter = filter;\n } else if ('properties' in metadataOrFilter || 'relations' in metadataOrFilter) {\n // First arg looks like metadata, but no second arg - treat as empty filter\n metadata = metadataOrFilter as EntityMetadata<Entity>;\n actualFilter = {};\n } else {\n // Called as (filter) - backward compatible\n metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n actualFilter = metadataOrFilter as Filter<unknown>;\n }\n\n const referencedFields = Array.from(\n new Set(Object.keys(actualFilter) as (keyof Filter<unknown>)[]),\n );\n return referencedFields.reduce((prev, curr) => {\n const currFilterValue = actualFilter[curr];\n if ((curr === 'and' || curr === 'or') && currFilterValue) {\n for (const subFilter of currFilterValue as Filter<unknown>[]) {\n prev = merge(prev, this.getReferencedRelationsRecursiveInternal(metadata, subFilter));\n }\n }\n const referencedRelation = metadata.relations.find((r) => r.name === curr);\n if (!referencedRelation) return prev;\n\n // Get nested relations recursively\n const nestedFilter = currFilterValue as Filter<unknown>;\n const targetMeta = em\n .getMetadata()\n .get(referencedRelation.type as unknown as EntityName<any>);\n const nestedRelations = nestedFilter\n ? this.getReferencedRelationsRecursiveInternal(targetMeta, nestedFilter)\n : {};\n\n return {\n ...prev,\n [curr]: merge((prev as NestedRecord)[curr] ?? {}, nestedRelations),\n };\n }, {});\n }\n\n private getReferencedRelationsRecursiveInternal(\n metadata: EntityMetadata<Entity>,\n filter: Filter<unknown> = {},\n ): NestedRecord {\n const em = this.repo.getEntityManager();\n const referencedFields = Array.from(new Set(Object.keys(filter) as (keyof Filter<unknown>)[]));\n return referencedFields.reduce((prev, curr) => {\n const currFilterValue = filter[curr];\n if ((curr === 'and' || curr === 'or') && currFilterValue) {\n for (const subFilter of currFilterValue as Filter<unknown>[]) {\n prev = merge(prev, this.getReferencedRelationsRecursiveInternal(metadata, subFilter));\n }\n }\n const referencedRelation = metadata.relations.find((r) => r.name === curr);\n if (!referencedRelation) return prev;\n\n // Get nested relations recursively\n const nestedFilter = currFilterValue as Filter<unknown>;\n const targetMeta = em\n .getMetadata()\n .get(referencedRelation.type as unknown as EntityName<any>);\n const nestedRelations = nestedFilter\n ? this.getReferencedRelationsRecursiveInternal(targetMeta, nestedFilter)\n : {};\n\n return {\n ...prev,\n [curr]: merge((prev as NestedRecord)[curr] ?? {}, nestedRelations),\n };\n }, {});\n }\n\n private get relationNames(): string[] {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return metadata.relations.map((r) => r.name);\n }\n}\n","import type {\n CommonFieldComparisonBetweenType,\n FilterComparisonOperators,\n} from '@ptc-org/nestjs-query-core';\n\n/**\n * @internal\n */\nexport type EntityComparisonField<Entity, F extends keyof Entity> =\n | Entity[F]\n | Entity[F][]\n | CommonFieldComparisonBetweenType<Entity[F]>\n | true\n | false\n | null;\n\n/**\n * @internal\n * Maps nestjs-query comparison operators to MikroORM operators.\n * This is a simplified version since MikroORM uses object-based filters.\n */\nexport class ComparisonBuilder<Entity> {\n /**\n * Maps a comparison operator to MikroORM filter format.\n *\n * @param field - the property in Entity to create the comparison for.\n * @param cmp - the FilterComparisonOperator (eq, neq, gt, etc...)\n * @param val - the value to compare to\n */\n build<F extends keyof Entity>(\n field: F,\n cmp: FilterComparisonOperators<Entity[F]>,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n const normalizedCmp = (cmp as string).toLowerCase();\n\n switch (normalizedCmp) {\n case 'eq':\n return { [field]: { $eq: val } };\n case 'neq':\n return { [field]: { $ne: val } };\n case 'gt':\n return { [field]: { $gt: val } };\n case 'gte':\n return { [field]: { $gte: val } };\n case 'lt':\n return { [field]: { $lt: val } };\n case 'lte':\n return { [field]: { $lte: val } };\n case 'like':\n return { [field]: { $like: val } };\n case 'notlike':\n return { [field]: { $not: { $like: val } } };\n case 'ilike':\n return { [field]: { $ilike: val } };\n case 'notilike':\n return { [field]: { $not: { $ilike: val } } };\n case 'is':\n return this.isComparison(field, val);\n case 'isnot':\n return this.isNotComparison(field, val);\n case 'in':\n this.checkNonEmptyArray(val);\n return { [field]: { $in: val } };\n case 'notin':\n this.checkNonEmptyArray(val);\n return { [field]: { $nin: val } };\n case 'between':\n return this.betweenComparison(field, val);\n case 'notbetween':\n return this.notBetweenComparison(field, val);\n default:\n throw new Error(`Unknown operator ${JSON.stringify(cmp)}`);\n }\n }\n\n private isComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (val === null) {\n return { [field]: { $eq: null } };\n }\n if (val === true) {\n return { [field]: { $eq: true } };\n }\n if (val === false) {\n return { [field]: { $eq: false } };\n }\n throw new Error(`Unexpected is operator param ${JSON.stringify(val)}`);\n }\n\n private isNotComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (val === null) {\n return { [field]: { $ne: null } };\n }\n if (val === true) {\n return { [field]: { $ne: true } };\n }\n if (val === false) {\n return { [field]: { $ne: false } };\n }\n throw new Error(`Unexpected isNot operator param ${JSON.stringify(val)}`);\n }\n\n private checkNonEmptyArray<F extends keyof Entity>(val: EntityComparisonField<Entity, F>): void {\n if (!Array.isArray(val)) {\n throw new Error(`Invalid in value expected an array got ${JSON.stringify(val)}`);\n }\n if (!val.length) {\n throw new Error(`Invalid in value expected a non-empty array got ${JSON.stringify(val)}`);\n }\n }\n\n private betweenComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (this.isBetweenVal(val)) {\n return {\n [field]: {\n $gte: val.lower,\n $lte: val.upper,\n },\n };\n }\n throw new Error(\n `Invalid value for between expected {lower: val, upper: val} got ${JSON.stringify(val)}`,\n );\n }\n\n private notBetweenComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (this.isBetweenVal(val)) {\n return {\n $or: [{ [field]: { $lt: val.lower } }, { [field]: { $gt: val.upper } }],\n };\n }\n throw new Error(\n `Invalid value for not between expected {lower: val, upper: val} got ${JSON.stringify(val)}`,\n );\n }\n\n private isBetweenVal<F extends keyof Entity>(\n val: EntityComparisonField<Entity, F>,\n ): val is CommonFieldComparisonBetweenType<Entity[F]> {\n return val !== null && typeof val === 'object' && 'lower' in val && 'upper' in val;\n }\n}\n","import type { EntityName, EntityProperty, EntityRepository, FilterQuery } from '@mikro-orm/core';\nimport type { AggregateQuery, Query } from '@ptc-org/nestjs-query-core';\n\nimport { FilterQueryBuilder } from './filter-query.builder';\n\nexport type EntityIndexRelation<Relation> = Relation & {\n __nestjsQuery__entityIndex__: number;\n};\n\n/**\n * @internal\n *\n * Class that will convert a Query into a MikroORM Query Builder for relations.\n */\nexport class RelationQueryBuilder<Entity extends object, Relation extends object> {\n readonly filterQueryBuilder: FilterQueryBuilder<Relation>;\n\n constructor(\n readonly repo: EntityRepository<Entity>,\n readonly relation: string,\n ) {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const relationRepo = em.getRepository(\n relationMeta.type as unknown as EntityName<Relation>,\n ) as unknown as EntityRepository<Relation>;\n this.filterQueryBuilder = new FilterQueryBuilder<Relation>(relationRepo);\n }\n\n /**\n * Executes a relation select using `em.find` so the implementation is database-agnostic.\n */\n async selectAndExecute(entity: Entity, query: Query<Relation>): Promise<Relation[]> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const RelationEntity = relationMeta.type as string;\n\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery, options } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n\n const findOptions: Record<string, unknown> = {};\n if (options?.orderBy) findOptions.orderBy = options.orderBy;\n if (options?.limit !== undefined) findOptions.limit = options.limit;\n if (options?.offset !== undefined) findOptions.offset = options.offset;\n\n // Use em.find to fetch relations directly; this is database-agnostic and avoids QueryBuilder\n return (await em.find(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n findOptions as Record<string, unknown>,\n )) as Relation[];\n }\n\n async count(entity: Entity, query: Query<Relation>): Promise<number> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const RelationEntity = relationMeta.type as string;\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n return em.count(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n );\n }\n\n async aggregate(\n entity: Entity,\n query: Query<Relation>,\n aggregateQuery: AggregateQuery<Relation>,\n ): Promise<Record<string, unknown>[]> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n\n // Database-agnostic aggregate: fetch matching relations and compute aggregates in-memory\n const RelationEntity = relationMeta.type as string;\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n\n // fetch all matching relations (no paging)\n const rows = (await em.find(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n )) as unknown[];\n\n // compute aggregates in-memory\n const aggs = aggregateQuery;\n const groupBy = aggs.groupBy ?? [];\n\n type RawAgg = Record<string, unknown>;\n const makeAggKey = (func: string, field: string) => `${func}_${field}`;\n const makeGroupKey = (field: string) => `GROUP_BY_${field}`;\n\n const records: RawAgg[] = [];\n\n const isNumeric = (v: unknown) => typeof v === 'number' || v instanceof Date;\n\n if (groupBy.length === 0) {\n const out: RawAgg = {};\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = rows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n // SUM and AVG only for numeric values\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] = fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Relation) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Relation) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Relation) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Relation) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Relation) => computeField('MIN', String(f)));\n\n records.push(out);\n } else {\n // Group rows by groupBy fields values\n const groups = new Map<string, unknown[]>();\n rows.forEach((r) => {\n const keyParts = groupBy.map((g) =>\n JSON.stringify((r as Record<string, unknown>)[String(g)]),\n );\n const key = keyParts.join('|');\n const arr = groups.get(key) ?? [];\n arr.push(r);\n groups.set(key, arr);\n });\n\n groups.forEach((groupRows, key) => {\n const parts = key.split('|').map((p) => JSON.parse(p));\n const out: RawAgg = {};\n groupBy.forEach((g, i) => {\n const val = parts[i];\n // Normalize boolean group values to 0/1 to match SQL behavior in tests\n out[makeGroupKey(String(g))] = typeof val === 'boolean' ? (val ? 1 : 0) : val;\n });\n\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = groupRows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] =\n fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Relation) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Relation) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Relation) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Relation) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Relation) => computeField('MIN', String(f)));\n\n records.push(out);\n });\n }\n\n return records;\n }\n\n private buildWhereCondition(\n entity: Entity,\n relationMeta: EntityProperty<Entity>,\n ): Record<string, unknown> {\n const em = this.repo.getEntityManager();\n const entityMeta = em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationEntityMeta = em\n .getMetadata()\n .get(relationMeta.type as unknown as EntityName<any>);\n const entityPrimaryKey = entityMeta.primaryKeys[0];\n const relationPrimaryKey = relationEntityMeta.primaryKeys[0];\n const entityId = (entity as Record<string, unknown>)[entityPrimaryKey];\n\n // Determine the relation type and build appropriate condition\n if (relationMeta.kind === 'm:1') {\n // Many-to-One: The foreign key is on the current entity\n // Try to get FK from multiple sources in order of preference\n let fkValue: unknown;\n const entityAsRecord = entity as Record<string, unknown>;\n\n // 1. Try the auto-generated FK field (e.g., test_entity_uni_directional_test_entity_pk)\n const fkFieldName = relationMeta.fieldNames?.[0];\n if (fkFieldName) {\n fkValue = entityAsRecord[fkFieldName];\n }\n\n // 2. If FK field not set, try common property naming pattern (e.g., testEntityId for testEntity relation)\n if (fkValue === undefined) {\n // Try relationName + 'Id'\n const conventionalIdField = `${relationMeta.name}Id`;\n fkValue = entityAsRecord[conventionalIdField];\n }\n\n // 3. If still undefined, try case-insensitive search for property matching relation name + Id\n // This handles cases where plain objects have properties like 'testEntityId' for 'testEntity' relation\n // or 'uniDirectionalTestEntityId' for 'testEntityUniDirectional' relation\n if (fkValue === undefined) {\n const relationNameLower = relationMeta.name.toLowerCase();\n const entityKeys = Object.keys(entityAsRecord);\n // Look for any property that ends with the relation name (case-insensitive) + Id\n const matchingKey = entityKeys.find((key) => {\n const keyLower = key.toLowerCase();\n if (keyLower === 'id' || !keyLower.endsWith('id')) {\n return false;\n }\n const base = keyLower.replace(/id$/, '');\n if (!base) {\n return false;\n }\n return relationNameLower.includes(base);\n });\n if (matchingKey) {\n fkValue = entityAsRecord[matchingKey];\n }\n }\n\n // 4. If still undefined, try getting it from the loaded relation object\n if (fkValue === undefined) {\n const relationValue = entityAsRecord[relationMeta.name];\n if (typeof relationValue === 'object' && relationValue !== null) {\n fkValue = (relationValue as Record<string, unknown>)[relationPrimaryKey];\n } else {\n fkValue = relationValue;\n }\n }\n\n return { [relationPrimaryKey]: fkValue };\n }\n\n if (relationMeta.kind === '1:1') {\n // One-to-One: Depends on which side owns the relationship\n if (relationMeta.owner) {\n // We own the FK, but we might not have it loaded\n // Try multiple approaches to get the FK value:\n\n // 1. Try the FK field (e.g., one_test_relation_test_relation_pk)\n const fkFieldName = relationMeta.joinColumns?.[0] || relationMeta.fieldNames?.[0];\n let fkValue: unknown;\n\n if (fkFieldName) {\n fkValue = (entity as Record<string, unknown>)[fkFieldName];\n }\n\n // 2. If FK field not set, try getting it from the loaded relation object\n if (fkValue === undefined) {\n const relationValue = (entity as Record<string, unknown>)[relationMeta.name];\n if (typeof relationValue === 'object' && relationValue !== null) {\n fkValue = (relationValue as Record<string, unknown>)[relationPrimaryKey];\n } else {\n fkValue = relationValue;\n }\n }\n\n // 3. If still undefined, we need to query via the inverse side\n // Query where the relation's inverse property matches our PK\n if (fkValue === undefined && relationMeta.inversedBy) {\n return { [relationMeta.inversedBy]: entityId };\n }\n\n return { [relationPrimaryKey]: fkValue };\n } else {\n // The other side owns the FK, so query where their FK matches our PK\n return { [relationMeta.mappedBy!]: entityId };\n }\n }\n\n if (relationMeta.kind === '1:m') {\n // One-to-Many: The foreign key is on the related entity\n const mappedBy = relationMeta.mappedBy;\n return { [mappedBy!]: entityId };\n }\n\n if (relationMeta.kind === 'm:n') {\n // Many-to-Many: Need to query through the pivot table\n // MikroORM handles this automatically through the relation\n if (relationMeta.owner) {\n return { [relationMeta.inversedBy!]: entityId };\n } else {\n return { [relationMeta.mappedBy!]: entityId };\n }\n }\n\n // Default case for other relation types\n return { [entityPrimaryKey]: entityId };\n }\n\n private getRelationMeta(): EntityProperty<Entity> {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationProp = metadata.properties[this.relation];\n\n if (!relationProp) {\n throw new Error(`Unable to find relation '${this.relation}' on entity`);\n }\n\n return relationProp as EntityProperty<Entity>;\n }\n\n get entityIndexColName(): string {\n return '__nestjsQuery__entityIndex__';\n }\n\n getRelationPrimaryKeysPropertyNameAndColumnsName(): {\n columnName: string;\n propertyName: string;\n }[] {\n const em = this.repo.getEntityManager();\n const relationMeta = this.getRelationMeta();\n const relationEntityMeta = em\n .getMetadata()\n .get(relationMeta.type as unknown as EntityName<any>);\n\n return relationEntityMeta.primaryKeys.map((pk) => {\n const prop = relationEntityMeta.properties[pk];\n return {\n propertyName: pk,\n columnName: prop.fieldNames?.[0] || pk,\n };\n });\n }\n}\n","import type { EntityMetadata } from '@mikro-orm/core';\nimport { raw } from '@mikro-orm/core';\nimport { BadRequestException } from '@nestjs/common';\nimport type { AggregateQuery, AggregateResponse } from '@ptc-org/nestjs-query-core';\nimport type { QueryBuilder } from './types';\n\nenum AggregateFuncs {\n AVG = 'AVG',\n SUM = 'SUM',\n COUNT = 'COUNT',\n MAX = 'MAX',\n MIN = 'MIN',\n}\n\n// Matches aggregate column prefixes in a case-insensitive way and multiple naming styles\nconst AGG_REGEXP =\n /^(AVG|SUM|COUNT|MAX|MIN|GROUP_BY|group_by|groupBy|avg|sum|count|max|min)_(.*)$/i;\n\n/**\n * @internal\n * Builds aggregate queries for MikroORM.\n */\nexport class AggregateBuilder<Entity extends object> {\n static buildSelectExpressions<Entity>(\n aggregate: AggregateQuery<Entity>,\n alias?: string,\n ): [string, string][] {\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, aggregate.count as any],\n [AggregateFuncs.SUM, aggregate.sum as any],\n [AggregateFuncs.AVG, aggregate.avg as any],\n [AggregateFuncs.MAX, aggregate.max as any],\n [AggregateFuncs.MIN, aggregate.min as any],\n ];\n\n const groupBySelects: [string, string][] = (aggregate.groupBy ?? []).map((f) => {\n const col = alias ? `\\`${alias}\\`.\\`${String(f)}\\`` : `\\`${String(f)}\\``;\n return [col, AggregateBuilder.getGroupByAlias(f as never)];\n });\n\n const funcSelects: [string, string][] = [];\n // Only create selects for aggregate functions that actually have fields\n aggs.forEach(([func, fields]) => {\n if (!fields || fields.length === 0) return;\n const aliases = fields.map((f) => {\n const col = alias ? `\\`${alias}\\`.\\`${String(f)}\\`` : `\\`${String(f)}\\``;\n return [`${func}(${col})`, AggregateBuilder.getAggregateAlias(func, f)];\n });\n funcSelects.push(...(aliases as [string, string][]));\n });\n\n const selects = [...groupBySelects, ...funcSelects];\n if (!selects.length) {\n throw new BadRequestException('No aggregate fields found.');\n }\n return selects;\n }\n static async asyncConvertToAggregateResponse<Entity>(\n responsePromise: Promise<Record<string, unknown>[]>,\n ): Promise<AggregateResponse<Entity>[]> {\n const aggResponse = await responsePromise;\n return this.convertToAggregateResponse(aggResponse);\n }\n\n static getAggregateSelects<Entity>(query: AggregateQuery<Entity>): string[] {\n return [...this.getAggregateGroupBySelects(query), ...this.getAggregateFuncSelects(query)];\n }\n\n private static getAggregateGroupBySelects<Entity>(query: AggregateQuery<Entity>): string[] {\n return (query.groupBy ?? []).map((f) => this.getGroupByAlias(f as never));\n }\n\n private static getAggregateFuncSelects<Entity>(query: AggregateQuery<Entity>): string[] {\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, query.count as any],\n [AggregateFuncs.SUM, query.sum as any],\n [AggregateFuncs.AVG, query.avg as any],\n [AggregateFuncs.MAX, query.max as any],\n [AggregateFuncs.MIN, query.min as any],\n ];\n return aggs.reduce((cols, [func, fields]) => {\n if (!fields || fields.length === 0) return cols;\n const aliases = fields.map((f) => this.getAggregateAlias(func, f));\n return [...cols, ...aliases];\n }, [] as string[]);\n }\n\n static getAggregateAlias<Entity>(func: AggregateFuncs, field: keyof Entity): string {\n return `${func}_${field as string}`;\n }\n\n static getGroupByAlias<Entity>(field: keyof Entity): string {\n return `GROUP_BY_${field as string}`;\n }\n\n static convertToAggregateResponse<Entity>(\n rawAggregates: Record<string, unknown>[],\n ): AggregateResponse<Entity>[] {\n return rawAggregates.map((response) => {\n const agg: AggregateResponse<Entity> = {} as AggregateResponse<Entity>;\n\n // Handle Mongo-style grouped _id object (e.g. _id: { group_by_field: value })\n if (response._id && typeof response._id === 'object') {\n const idObj = response._id as Record<string, unknown>;\n Object.keys(idObj).forEach((k) => {\n const m = /^(?:GROUP_BY|group_by|groupBy)_(.*)$/i.exec(k);\n if (m) {\n const field = m[1] as keyof Entity;\n agg.groupBy = { ...(agg.groupBy as Record<string, unknown>), [field]: idObj[k] } as any;\n }\n });\n }\n\n Object.keys(response).forEach((resultField) => {\n if (resultField === '_id') return;\n\n const matchResult = AGG_REGEXP.exec(resultField);\n if (!matchResult) {\n throw new Error('Unknown aggregate column encountered.');\n }\n const matchedFunc = matchResult[1];\n const matchedFieldName = matchResult[2];\n const funcKey = matchedFunc.toLowerCase();\n // normalize to aggregate response keys: count, sum, avg, max, min\n const aggFunc = (\n funcKey === 'group_by' || funcKey === 'groupby' ? 'groupBy' : funcKey\n ) as keyof AggregateResponse<Entity>;\n if (aggFunc === 'groupBy') {\n // If group_by leaked into top-level, set it on groupBy\n agg.groupBy = {\n ...(agg.groupBy as Record<string, unknown>),\n [matchedFieldName]: response[resultField],\n } as any;\n return;\n }\n\n const fieldName = matchedFieldName as keyof Entity;\n agg[aggFunc] = {\n ...(agg[aggFunc] as Record<string, unknown>),\n [fieldName]: response[resultField],\n } as any;\n });\n\n return agg;\n });\n }\n\n /**\n * Gets the actual database column name for a property from entity metadata.\n * @param metadata - the entity metadata\n * @param propertyName - the property name\n * @returns the database column name\n */\n private getColumnName(metadata: EntityMetadata<Entity>, propertyName: string): string {\n const prop = metadata.properties[propertyName as keyof (typeof metadata)['properties']];\n if (prop && prop.fieldNames && prop.fieldNames.length > 0) {\n return prop.fieldNames[0];\n }\n return propertyName; // fallback to property name if not found\n }\n\n /**\n * Builds aggregate SELECT clause for MikroORM QueryBuilder.\n * @param qb - the MikroORM QueryBuilder\n * @param aggregate - the aggregates to select.\n * @param alias - optional alias to use to qualify an identifier\n */\n build<Qb extends QueryBuilder<Entity>>(\n qb: Qb,\n aggregate: AggregateQuery<Entity>,\n alias?: string,\n ): Qb {\n // Get entity metadata for column name resolution via the qb's internal helper\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const metadata: EntityMetadata<Entity> | undefined = (qb as any).mainAlias?.metadata;\n\n const selects: [string, string][] = [];\n // Group by selects\n selects.push(...this.createGroupBySelect(aggregate.groupBy as any, alias, metadata));\n\n // Only add aggregate selects for functions that were requested\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, aggregate.count as any],\n [AggregateFuncs.SUM, aggregate.sum as any],\n [AggregateFuncs.AVG, aggregate.avg as any],\n [AggregateFuncs.MAX, aggregate.max as any],\n [AggregateFuncs.MIN, aggregate.min as any],\n ];\n aggs.forEach(([func, fields]) => {\n if (!fields || fields.length === 0) return;\n selects.push(...this.createAggSelect(func, fields, alias, metadata));\n });\n if (!selects.length) {\n throw new BadRequestException('No aggregate fields found.');\n }\n\n // Use MikroORM's raw() and addSelect() to avoid finalizing the QueryBuilder\n selects.forEach(([selectExpr, selectAlias]) => {\n qb.addSelect!(raw(`${selectExpr} as \"${selectAlias}\"`));\n });\n\n return qb;\n }\n\n private createAggSelect(\n func: AggregateFuncs,\n fields?: (keyof Entity)[],\n alias?: string,\n metadata?: EntityMetadata<Entity>,\n ): [string, string][] {\n if (!fields) {\n return [];\n }\n return fields.map((field) => {\n // Get the actual database column name from metadata\n const columnName = metadata\n ? this.getColumnName(metadata, field as string)\n : (field as string);\n const col = alias ? `\\`${alias}\\`.\\`${columnName}\\`` : `\\`${columnName}\\``;\n return [`${func}(${col})`, AggregateBuilder.getAggregateAlias(func, field)];\n });\n }\n\n private createGroupBySelect(\n fields?: (keyof Entity)[],\n alias?: string,\n metadata?: EntityMetadata<Entity>,\n ): [string, string][] {\n if (!fields) {\n return [];\n }\n return fields.map((field) => {\n // Get the actual database column name from metadata\n const columnName = metadata\n ? this.getColumnName(metadata, field as string)\n : (field as string);\n const col = alias ? `\\`${alias}\\`.\\`${columnName}\\`` : `\\`${columnName}\\``;\n return [`${col}`, AggregateBuilder.getGroupByAlias(field)];\n });\n }\n}\n","import type {\n Collection,\n EntityName,\n EntityProperty,\n EntityRepository,\n FilterQuery,\n} from '@mikro-orm/core';\nimport { wrap } from '@mikro-orm/core';\nimport type {\n AggregateQuery,\n AggregateResponse,\n Class,\n DeepPartial,\n Filter,\n FindRelationOptions,\n GetByIdOptions,\n ModifyRelationOptions,\n Query,\n} from '@ptc-org/nestjs-query-core';\nimport { AssemblerFactory } from '@ptc-org/nestjs-query-core';\n\nimport type { FilterQueryBuilder } from '../query/index';\nimport { AggregateBuilder, RelationQueryBuilder } from '../query/index';\n\ninterface RelationMetadata {\n kind: 'm:1' | '1:m' | '1:1' | 'm:n';\n type: string;\n entity: () => EntityName<unknown>;\n mappedBy?: string;\n}\n\n/**\n * Base class to house relations loading.\n * @internal\n */\nexport abstract class RelationQueryService<Entity extends object> {\n abstract filterQueryBuilder: FilterQueryBuilder<Entity>;\n\n abstract EntityClass: Class<Entity>;\n\n abstract repo: EntityRepository<Entity>;\n\n abstract getById(id: string | number, opts?: GetByIdOptions<Entity>): Promise<Entity>;\n\n /**\n * Query for an array of relations.\n * @param RelationClass - The class to serialize the relations into.\n * @param dto - The dto to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page and sort relations.\n */\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n query: Query<Relation>,\n ): Promise<Relation[]>;\n\n /**\n * Query for relations for an array of Entities. This method will return a map with the Entity as the key and the relations as the value.\n * @param RelationClass - The class of the relation.\n * @param relationName - The name of the relation to load.\n * @param entities - the dtos to find relations for.\n * @param query - A query to use to filter, page, and sort relations.\n */\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n query: Query<Relation>,\n ): Promise<Map<Entity, Relation[]>>;\n\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n query: Query<Relation>,\n ): Promise<Relation[] | Map<Entity, Relation[]>> {\n if (Array.isArray(dto)) {\n return this.batchQueryRelations(RelationClass, relationName, dto, query);\n }\n if (this.isRelationClassIdentity(RelationClass, relationName)) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return (await relationQueryBuilder.selectAndExecute(dto, query)) as Relation[];\n }\n\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return assembler.convertToDTOs(\n await relationQueryBuilder.selectAndExecute(dto, assembler.convertQuery(query)),\n );\n }\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<Map<Entity, AggregateResponse<Relation>[]>>;\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<AggregateResponse<Relation>[]>;\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<AggregateResponse<Relation>[] | Map<Entity, AggregateResponse<Relation>[]>> {\n if (Array.isArray(dto)) {\n return this.batchAggregateRelations(RelationClass, relationName, dto, filter, aggregate);\n }\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const rawResults = await relationQueryBuilder.aggregate(\n dto,\n assembler.convertQuery({ filter }),\n assembler.convertAggregateQuery(aggregate),\n );\n const aggResponse = AggregateBuilder.convertToAggregateResponse(rawResults);\n return aggResponse.map((agg) => {\n const res = assembler.convertAggregateResponse(agg);\n return res;\n });\n }\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n ): Promise<Map<Entity, number>>;\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n filter: Filter<Relation>,\n ): Promise<number>;\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n filter: Filter<Relation>,\n ): Promise<number | Map<Entity, number>> {\n if (Array.isArray(dto)) {\n return this.batchCountRelations(RelationClass, relationName, dto, filter);\n }\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return relationQueryBuilder.count(dto, assembler.convertQuery({ filter }));\n }\n\n /**\n * Find a relation for an array of Entities. This will return a Map where the key is the Entity and the value is to\n * relation or undefined if not found.\n * @param RelationClass - the class of the relation\n * @param relationName - the name of the relation to load.\n * @param dtos - the dtos to find the relation for.\n * @param opts - Additional options\n */\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dtos: Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<Map<Entity, Relation | undefined>>;\n\n /**\n * Finds a single relation.\n * @param RelationClass - The class to serialize the relation into.\n * @param dto - The dto to find the relation for.\n * @param relationName - The name of the relation to query for.\n * @param opts - Additional options\n */\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n opts?: FindRelationOptions<Relation>,\n ): Promise<Relation | undefined>;\n\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<(Relation | undefined) | Map<Entity, Relation | undefined>> {\n if (Array.isArray(dto)) {\n return this.batchFindRelations(RelationClass, relationName, dto, opts);\n }\n if (this.isRelationClassIdentity(RelationClass, relationName)) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const relations = await relationQueryBuilder.selectAndExecute(dto, {\n filter: opts?.filter,\n paging: { limit: 1 },\n });\n return relations[0] as Relation | undefined;\n }\n\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const relations = await relationQueryBuilder.selectAndExecute(dto, {\n filter: opts?.filter,\n paging: { limit: 1 },\n });\n const relationEntity = relations[0];\n return relationEntity ? assembler.convertToDTO(relationEntity) : undefined;\n }\n\n /**\n * Add a single relation.\n * @param id - The id of the entity to add the relation to.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of relations to add.\n * @param opts - Addition options\n */\n async addRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to add to ${this.EntityClass.name}`);\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: entity } as any);\n }\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and add relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.add === 'function') {\n for (const relation of relations) {\n collection.add(relation);\n }\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Set the relations on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of the relation to set on the entity. If the relationIds is empty all relations\n * will be removed.\n * @param opts - Additional options\n */\n async setRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (relationIds.length) {\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to set on ${this.EntityClass.name}`);\n }\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const currentRelations = await relationQueryBuilder.selectAndExecute(\n entity,\n {} as Query<Relation>,\n );\n const nextSet = new Set(relations.map((r) => (wrap(r as any) as any).getPrimaryKey()));\n\n for (const currentRelation of currentRelations) {\n const currentPk = (wrap(currentRelation as any) as any).getPrimaryKey();\n if (!nextSet.has(currentPk)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(currentRelation as any).assign({ [meta.mappedBy]: null } as any);\n }\n }\n\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: entity } as any);\n }\n\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and set relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.set === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n collection.set(relations);\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Set the relation on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationId - The id of the relation to set on the entity.\n * @param opts - Additional options\n */\n async setRelation<Relation extends object>(\n relationName: string,\n id: string | number,\n relationId: string | number,\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const relation = (\n await this.getRelations<Relation>(relationName, [relationId], opts?.relationFilter)\n )[0];\n if (!relation) {\n throw new Error(`Unable to find ${relationName} to set on ${this.EntityClass.name}`);\n }\n\n // Set the relation directly\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ [relationName]: relation } as any);\n await this.repo.getEntityManager().flush();\n\n return entity;\n }\n\n /**\n * Removes multiple relations.\n * @param id - The id of the entity to add the relation to.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of the relations to add.\n * @param opts - Additional options\n */\n async removeRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to remove from ${this.EntityClass.name}`);\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: null } as any);\n }\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and remove relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.remove === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n for (const relation of relations) {\n collection.remove(relation);\n }\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Remove the relation on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationId - The id of the relation to set on the entity.\n */\n async removeRelation<Relation extends object>(\n relationName: string,\n id: string | number,\n relationId: string | number,\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const relation = (\n await this.getRelations<Relation>(relationName, [relationId], opts?.relationFilter)\n )[0];\n if (!relation) {\n throw new Error(`Unable to find ${relationName} to remove from ${this.EntityClass.name}`);\n }\n const meta = this.getRelationMeta(relationName);\n if (meta.kind === '1:1' || meta.kind === 'm:1') {\n // For single relations, prefer nulling the explicit FK field when available.\n // This matches managed behavior where the relation object may remain attached in memory,\n // while the persisted FK value is cleared.\n const fkFieldName = `${relationName}Id`;\n const assignData: Record<string, null> = {};\n\n // Also clear the FK field if it exists on the entity\n const ownDescriptor = Object.getOwnPropertyDescriptor(entity, fkFieldName);\n const protoDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(entity),\n fkFieldName,\n );\n const descriptor = ownDescriptor ?? protoDescriptor;\n const canAssignFk =\n fkFieldName in (entity as Record<string, unknown>) &&\n (!descriptor || Boolean(descriptor.set) || descriptor.writable === true);\n\n if (canAssignFk) {\n assignData[fkFieldName] = null;\n } else {\n assignData[relationName] = null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign(assignData as any);\n } else {\n if (meta.kind === '1:m' && meta.mappedBy) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: null } as any);\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // For collections, remove the relation\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.remove === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n collection.remove(relation);\n }\n }\n\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n getRelationQueryBuilder<Relation extends object>(\n name: string,\n ): RelationQueryBuilder<Entity, Relation> {\n return new RelationQueryBuilder(this.repo, name);\n }\n\n /**\n * Query for an array of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchQueryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n query: Query<Relation>,\n ): Promise<Map<Entity, Relation[]>> {\n const bypassAssembler = this.isRelationClassIdentity(RelationClass, relationName);\n const assembler = bypassAssembler\n ? undefined\n : AssemblerFactory.getAssembler(RelationClass, this.getRelationEntity(relationName));\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler ? assembler.convertQuery(query) : query;\n\n const results = new Map<Entity, Relation[]>();\n\n // Process each entity and collect its relations\n await Promise.all(\n entities.map(async (entity) => {\n const relations = await relationQueryBuilder.selectAndExecute(entity, convertedQuery);\n const relationDtos = bypassAssembler\n ? (relations as Relation[])\n : await assembler!.convertToDTOs(relations);\n // Only add to map if there are relations (undefined for entities with no relations)\n if (relationDtos.length > 0) {\n results.set(entity, relationDtos);\n }\n }),\n );\n\n return results;\n }\n\n /**\n * Query for an array of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchAggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<Map<Entity, AggregateResponse<Relation>[]>> {\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler.convertQuery({ filter });\n\n const results = new Map<Entity, AggregateResponse<Relation>[]>();\n\n await Promise.all(\n entities.map(async (entity) => {\n const rawAggregates = await relationQueryBuilder.aggregate(\n entity,\n convertedQuery,\n assembler.convertAggregateQuery(aggregate),\n );\n const aggResponse = AggregateBuilder.convertToAggregateResponse(rawAggregates);\n results.set(\n entity,\n aggResponse.map((agg) => assembler.convertAggregateResponse(agg)),\n );\n }),\n );\n\n return results;\n }\n\n /**\n * Count the number of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param filter - The filter to apply to the relation query.\n */\n private async batchCountRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n ): Promise<Map<Entity, number>> {\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler.convertQuery({ filter });\n\n const results = new Map<Entity, number>();\n\n await Promise.all(\n entities.map(async (entity) => {\n const count = await relationQueryBuilder.count(entity, convertedQuery);\n results.set(entity, count);\n }),\n );\n\n return results;\n }\n\n /**\n * Query for a relation for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param dtos - The dto to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchFindRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dtos: Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<Map<Entity, Relation | undefined>> {\n const batchResults = await this.batchQueryRelations(RelationClass, relationName, dtos, {\n paging: { limit: 1 },\n filter: opts?.filter,\n });\n const results = new Map<Entity, Relation | undefined>();\n // Only add entities that have matching relations to the map\n batchResults.forEach((relations, dto) => {\n // get just the first one\n if (relations?.[0]) {\n results.set(dto, relations[0]);\n }\n });\n return results;\n }\n\n private isRelationClassIdentity<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n ): boolean {\n const relationEntity = this.getRelationEntity(relationName) as Class<Relation>;\n return RelationClass === relationEntity || RelationClass.name === relationEntity.name;\n }\n\n private getRelationMeta(relationName: string): RelationMetadata {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationMeta = metadata.relations.find((r: EntityProperty) => r.name === relationName);\n if (!relationMeta) {\n throw new Error(`Unable to find relation ${relationName} on ${this.EntityClass.name}`);\n }\n return {\n kind: relationMeta.kind as 'm:1' | '1:m' | '1:1' | 'm:n',\n type: relationMeta.type,\n entity: relationMeta.entity,\n mappedBy: relationMeta.mappedBy,\n };\n }\n\n private getRelationEntity(relationName: string): Class<DeepPartial<unknown>> {\n const relationMeta = this.getRelationMeta(relationName);\n const entity = relationMeta.entity() as Class<DeepPartial<unknown>>;\n return entity && 'class' in entity ? (entity.class as Class<DeepPartial<unknown>>) : entity;\n }\n\n private async getRelations<Relation extends object>(\n relationName: string,\n ids: (string | number)[],\n filter?: Filter<Relation>,\n ): Promise<Relation[]> {\n const em = this.repo.getEntityManager();\n const relationMeta = this.getRelationMeta(relationName);\n const RelationEntity = relationMeta.entity() as EntityName<Relation>;\n const relationMetadata = em.getMetadata().get(RelationEntity);\n const primaryKey = relationMetadata.primaryKeys[0];\n\n // Build the filter with both the IDs and any additional filter\n const idFilter = { [primaryKey]: { $in: ids } } as FilterQuery<Relation>;\n\n if (filter) {\n // Combine with additional filter if provided\n const whereBuilder = this.filterQueryBuilder.whereBuilder;\n const additionalFilter = whereBuilder.build(\n filter as Filter<Entity>,\n ) as FilterQuery<Relation>;\n return em.find(RelationEntity, {\n $and: [idFilter, additionalFilter],\n } as any);\n }\n\n return em.find(RelationEntity, idFilter as any);\n }\n\n private foundAllRelations<Relation>(\n relationIds: (string | number)[],\n relations: Relation[],\n ): boolean {\n return new Set([...relationIds]).size === relations.length;\n }\n}\n","import type {\n EntityName,\n EntityRepository,\n FilterQuery,\n RequiredEntityData,\n} from '@mikro-orm/core';\nimport { wrap } from '@mikro-orm/core';\nimport { MethodNotAllowedException, NotFoundException } from '@nestjs/common';\nimport type {\n AggregateQuery,\n AggregateResponse,\n Class,\n DeepPartial,\n DeleteManyResponse,\n DeleteOneOptions,\n Filter,\n Filterable,\n FindByIdOptions,\n GetByIdOptions,\n Query,\n QueryService,\n UpdateManyResponse,\n UpdateOneOptions,\n} from '@ptc-org/nestjs-query-core';\n\nimport { AggregateBuilder, FilterQueryBuilder, WhereBuilder } from '../query';\nimport { RelationQueryService } from './relation-query.service';\n\nexport interface MikroOrmQueryServiceOpts<Entity extends object> {\n useSoftDelete?: boolean;\n filterQueryBuilder?: FilterQueryBuilder<Entity>;\n}\n\n/**\n * Base class for all query services that use a MikroORM EntityRepository.\n *\n * @example\n *\n * ```ts\n * @QueryService(TodoItemEntity)\n * export class TodoItemService extends MikroOrmQueryService<TodoItemEntity> {\n * constructor(\n * @InjectRepository(TodoItemEntity) repo: EntityRepository<TodoItemEntity>,\n * ) {\n * super(repo);\n * }\n * }\n * ```\n */\nexport class MikroOrmQueryService<Entity extends object>\n extends RelationQueryService<Entity>\n implements QueryService<Entity, DeepPartial<Entity>, DeepPartial<Entity>>\n{\n readonly filterQueryBuilder: FilterQueryBuilder<Entity>;\n\n readonly useSoftDelete: boolean;\n\n constructor(\n readonly repo: EntityRepository<Entity>,\n opts?: MikroOrmQueryServiceOpts<Entity>,\n ) {\n super();\n this.filterQueryBuilder = opts?.filterQueryBuilder ?? new FilterQueryBuilder<Entity>(this.repo);\n this.useSoftDelete = opts?.useSoftDelete ?? false;\n }\n\n get EntityClass(): Class<Entity> {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return metadata.class as Class<Entity>;\n }\n\n /**\n * Query for multiple entities, using a Query from `@ptc-org/nestjs-query-core`.\n *\n * @example\n * ```ts\n * const todoItems = await this.service.query({\n * filter: { title: { eq: 'Foo' } },\n * paging: { limit: 10 },\n * sorting: [{ field: \"create\", direction: SortDirection.DESC }],\n * });\n * ```\n * @param query - The Query used to filter, page, and sort rows.\n */\n async query(query: Query<Entity>): Promise<Entity[]> {\n const { filterQuery, options } = this.filterQueryBuilder.buildFindOptions(query);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n return em.find(this.EntityClass, where ?? {}, options as Record<string, unknown>);\n }\n\n async aggregate(\n filter: Filter<Entity>,\n aggregate: AggregateQuery<Entity>,\n ): Promise<AggregateResponse<Entity>[]> {\n // Build find options for the filter and fetch matching rows, then compute aggregates in-memory\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions({ filter } as Query<Entity>);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n const rows = (await em.find(this.EntityClass, where ?? {})) as unknown[];\n\n // Compute aggregates similar to RelationQueryBuilder (database-agnostic)\n const aggs = aggregate;\n const groupBy = aggs.groupBy ?? [];\n const records: Record<string, unknown>[] = [];\n const makeAggKey = (func: string, field: string) => `${func}_${field}`;\n const makeGroupKey = (field: string) => `GROUP_BY_${field}`;\n\n const isNumeric = (v: unknown) => typeof v === 'number' || v instanceof Date;\n\n if (groupBy.length === 0) {\n const out: Record<string, unknown> = {};\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = rows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] = fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n // Only add aggregate selects for functions that were requested\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Entity) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Entity) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Entity) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Entity) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Entity) => computeField('MIN', String(f)));\n\n records.push(out);\n } else {\n const groups = new Map<string, unknown[]>();\n rows.forEach((r) => {\n const key = groupBy\n .map((g) => JSON.stringify((r as Record<string, unknown>)[String(g)]))\n .join('|');\n const arr = groups.get(key) ?? [];\n arr.push(r);\n groups.set(key, arr);\n });\n\n groups.forEach((groupRows, key) => {\n const parts = key.split('|').map((p) => JSON.parse(p));\n const out: Record<string, unknown> = {};\n groupBy.forEach((g, i) => {\n const val = parts[i];\n out[makeGroupKey(String(g))] = typeof val === 'boolean' ? (val ? 1 : 0) : val;\n });\n\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = groupRows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] =\n fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Entity) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Entity) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Entity) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Entity) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Entity) => computeField('MIN', String(f)));\n\n records.push(out);\n });\n }\n\n return records.map((r) => AggregateBuilder.convertToAggregateResponse([r])[0]);\n }\n\n async count(filter: Filter<Entity>): Promise<number> {\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions({ filter } as Query<Entity>);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n return em.count(this.EntityClass, where ?? {});\n }\n\n /**\n * Find an entity by it's `id`.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.findById(1);\n * ```\n * @param id - The id of the record to find.\n */\n async findById(id: string | number, opts?: FindByIdOptions<Entity>): Promise<Entity | undefined> {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0] as keyof Entity;\n let where: FilterQuery<Entity> = { [primaryKey]: id } as FilterQuery<Entity>;\n if (opts?.filter) {\n const whereBuilder = new WhereBuilder<Entity>();\n const additional = whereBuilder.build(opts.filter);\n where = { $and: [where, additional] } as unknown as FilterQuery<Entity>;\n }\n if (this.useSoftDelete) {\n where = { $and: [where, { deletedAt: null }] } as unknown as FilterQuery<Entity>;\n }\n const entity = await this.em.findOne(this.EntityClass, where as FilterQuery<Entity>);\n return entity ?? undefined;\n }\n\n /**\n * Gets an entity by it's `id`. If the entity is not found a rejected promise is returned.\n *\n * @example\n * ```ts\n * try {\n * const todoItem = await this.service.getById(1);\n * } catch(e) {\n * console.error('Unable to find entity with id = 1');\n * }\n * ```\n * @param id - The id of the record to find.\n */\n async getById(id: string | number, opts?: GetByIdOptions<Entity>): Promise<Entity> {\n const entity = await this.findById(id, opts);\n if (!entity) {\n throw new NotFoundException(`Unable to find ${this.EntityClass.name} with id: ${id}`);\n }\n return entity;\n }\n\n /**\n * Creates a single entity.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.createOne({title: 'Todo Item', completed: false });\n * ```\n * @param record - The entity to create.\n */\n async createOne(record: DeepPartial<Entity>): Promise<Entity> {\n const entity = await this.ensureIsEntityAndDoesNotExist(record);\n await this.repo.getEntityManager().persist(entity).flush();\n return entity;\n }\n\n /**\n * Create multiple entities.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.createMany([\n * {title: 'Todo Item 1', completed: false },\n * {title: 'Todo Item 2', completed: true },\n * ]);\n * ```\n * @param records - The entities to create.\n */\n async createMany(records: DeepPartial<Entity>[]): Promise<Entity[]> {\n const entities = await Promise.all(records.map((r) => this.ensureIsEntityAndDoesNotExist(r)));\n await this.repo.getEntityManager().persist(entities).flush();\n return entities;\n }\n\n /**\n * Update an entity.\n *\n * @example\n * ```ts\n * const updatedEntity = await this.service.updateOne(1, { completed: true });\n * ```\n * @param id - The `id` of the record.\n * @param update - A `Partial` of the entity with fields to update.\n * @param opts - Additional options.\n */\n async updateOne(\n id: number | string,\n update: DeepPartial<Entity>,\n opts?: UpdateOneOptions<Entity>,\n ): Promise<Entity> {\n const dateWithClearUndefined = Object.fromEntries(\n Object.entries(update).filter(([, value]) => value !== undefined),\n ) as DeepPartial<Entity>;\n this.ensureIdIsNotPresent(dateWithClearUndefined);\n const entity = await this.getById(id, opts);\n\n wrap(entity).assign(dateWithClearUndefined as unknown as Partial<Entity> as any);\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n /**\n * Update multiple entities with a `@ptc-org/nestjs-query-core` Filter.\n *\n * @example\n * ```ts\n * const { updatedCount } = await this.service.updateMany(\n * { completed: true }, // the update to apply\n * { title: { eq: 'Foo Title' } } // Filter to find records to update\n * );\n * ```\n * @param update - A `Partial` of entity with the fields to update\n * @param filter - A Filter used to find the records to update\n */\n async updateMany(\n update: DeepPartial<Entity>,\n filter: Filter<Entity>,\n ): Promise<UpdateManyResponse> {\n this.ensureIdIsNotPresent(update);\n\n // Get entities matching the filter\n const entities = await this.query({ filter });\n\n // Update each entity\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign(update as any);\n }\n\n await this.repo.getEntityManager().flush();\n return { updatedCount: entities.length };\n }\n\n /**\n * Delete an entity by `id`.\n *\n * @example\n *\n * ```ts\n * const deletedTodo = await this.service.deleteOne(1);\n * ```\n *\n * @param id - The `id` of the entity to delete.\n * @param filter Additional filter to use when finding the entity to delete.\n */\n async deleteOne(id: string | number, opts?: DeleteOneOptions<Entity>): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const em = this.repo.getEntityManager();\n if (this.useSoftDelete) {\n // For soft delete, set the deletedAt field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: new Date() } as any);\n await em.flush();\n } else {\n await em.remove(entity).flush();\n }\n return entity;\n }\n\n /**\n * Delete multiple records with a `@ptc-org/nestjs-query-core` `Filter`.\n *\n * @example\n *\n * ```ts\n * const { deletedCount } = this.service.deleteMany({\n * created: { lte: new Date('2020-1-1') }\n * });\n * ```\n *\n * @param filter - A `Filter` to find records to delete.\n */\n async deleteMany(filter: Filter<Entity>): Promise<DeleteManyResponse> {\n const entities = await this.query({ filter });\n const em = this.repo.getEntityManager();\n\n if (this.useSoftDelete) {\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: new Date() } as any);\n }\n } else {\n for (const entity of entities) {\n em.remove(entity);\n }\n }\n\n await em.flush();\n return { deletedCount: entities.length };\n }\n\n /**\n * Restore an entity by `id`.\n *\n * @example\n *\n * ```ts\n * const restoredTodo = await this.service.restoreOne(1);\n * ```\n *\n * @param id - The `id` of the entity to restore.\n * @param opts Additional filter to use when finding the entity to restore.\n */\n async restoreOne(id: string | number, opts?: Filterable<Entity>): Promise<Entity> {\n this.ensureSoftDeleteEnabled();\n // When restoring, we need to find soft-deleted entities, so bypass filters\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0] as keyof Entity;\n\n let whereClause: FilterQuery<Entity> = {\n [primaryKey]: id,\n } as FilterQuery<Entity>;\n if (opts?.filter) {\n // Merge the additional filter with the ID filter\n const whereBuilder = new WhereBuilder<Entity>();\n const additionalWhere = whereBuilder.build(opts.filter);\n whereClause = {\n $and: [whereClause, additionalWhere as FilterQuery<Entity>],\n } as FilterQuery<Entity>;\n }\n\n const entity = await em.findOne(this.EntityClass, whereClause, {\n filters: false,\n });\n if (!entity) {\n throw new NotFoundException(`Unable to find ${this.EntityClass.name} with id: ${id}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: null } as any);\n await em.flush();\n return entity;\n }\n\n /**\n * Restores multiple records with a `@ptc-org/nestjs-query-core` `Filter`.\n *\n * @example\n *\n * ```ts\n * const { updatedCount } = this.service.restoreMany({\n * created: { lte: new Date('2020-1-1') }\n * });\n * ```\n *\n * @param filter - A `Filter` to find records to restore.\n */\n async restoreMany(filter: Filter<Entity>): Promise<UpdateManyResponse> {\n this.ensureSoftDeleteEnabled();\n // When restoring, we need to find soft-deleted entities, so bypass filters\n const em = this.repo.getEntityManager();\n const whereBuilder = new WhereBuilder<Entity>();\n const whereClause = whereBuilder.build(filter);\n const entities = await em.find(this.EntityClass, whereClause as FilterQuery<Entity>, {\n filters: false,\n });\n\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: null } as any);\n }\n\n await em.flush();\n return { updatedCount: entities.length };\n }\n\n private get em() {\n return this.repo.getEntityManager();\n }\n\n private async ensureIsEntityAndDoesNotExist(e: DeepPartial<Entity>): Promise<Entity> {\n if (!(e instanceof this.EntityClass)) {\n const entity = this.em.create(\n this.repo.getEntityName() as unknown as EntityName<any>,\n e as RequiredEntityData<Entity>,\n );\n return this.ensureEntityDoesNotExist(entity as Entity);\n }\n return this.ensureEntityDoesNotExist(e);\n }\n\n private async ensureEntityDoesNotExist(e: Entity): Promise<Entity> {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0];\n const id = (e as Record<string, unknown>)[primaryKey];\n\n if (id) {\n // Clear the EM to avoid finding stale cached entities after truncate\n this.em.clear();\n const found = await this.repo.findOne({\n [primaryKey]: id,\n } as FilterQuery<Entity>);\n if (found) {\n throw new Error('Entity already exists');\n }\n }\n return e;\n }\n\n private ensureIdIsNotPresent(e: DeepPartial<Entity>): void {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0];\n\n if ((e as Record<string, unknown>)[primaryKey]) {\n throw new Error('Id cannot be specified when updating');\n }\n }\n\n private ensureSoftDeleteEnabled(): void {\n if (!this.useSoftDelete) {\n throw new MethodNotAllowedException(\n `Restore not allowed for non soft deleted entity ${this.EntityClass.name}.`,\n );\n }\n }\n}\n","import type { AnyEntity, EntityName, EntityRepository } from '@mikro-orm/core';\nimport type { FactoryProvider } from '@nestjs/common';\nimport { getRepositoryToken } from '@mikro-orm/nestjs';\nimport { getQueryServiceToken } from '@ptc-org/nestjs-query-core';\n\nimport { MikroOrmQueryService } from './services';\n\nfunction createMikroOrmQueryServiceProvider<Entity extends object>(\n EntityClass: EntityName<Entity>,\n contextName?: string,\n): FactoryProvider {\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provide: getQueryServiceToken(EntityClass as any),\n useFactory(repo: EntityRepository<Entity>) {\n return new MikroOrmQueryService(repo);\n },\n inject: [getRepositoryToken(EntityClass, contextName)],\n };\n}\n\nexport const createMikroOrmQueryServiceProviders = (\n entities: EntityName<AnyEntity>[],\n contextName?: string,\n): FactoryProvider[] =>\n entities.map((entity) => createMikroOrmQueryServiceProvider(entity, contextName));\n","import type { AnyEntity, EntityName } from '@mikro-orm/core';\nimport type { DynamicModule } from '@nestjs/common';\nimport { MikroOrmModule } from '@mikro-orm/nestjs';\n\nimport { createMikroOrmQueryServiceProviders } from './providers';\n\nexport class NestjsQueryMikroOrmModule {\n static forFeature(entities: EntityName<AnyEntity>[], contextName?: string): DynamicModule {\n const queryServiceProviders = createMikroOrmQueryServiceProviders(entities, contextName);\n const mikroOrmModule = MikroOrmModule.forFeature(entities, contextName);\n return {\n imports: [mikroOrmModule],\n module: NestjsQueryMikroOrmModule,\n providers: [...queryServiceProviders],\n exports: [...queryServiceProviders, mikroOrmModule],\n };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/lib/query/where.builder.ts","../src/lib/query/filter-query.builder.ts","../src/lib/query/comparison.builder.ts","../src/lib/query/relation-query.builder.ts","../src/lib/query/aggregate.builder.ts","../src/lib/services/relation-query.service.ts","../src/lib/services/mikro-orm-query.service.ts","../src/lib/providers.ts","../src/lib/nest-query-mikro-orm.module.ts"],"names":["WhereBuilder","build","filter","and","or","conditions","length","andConditions","map","f","push","$and","orConditions","$or","fieldConditions","buildFieldComparisons","Object","keys","KNOWN_OPERATORS","Set","isComparisonObject","obj","Array","isArray","some","key","has","toLowerCase","result","forEach","field","comparison","buildComparison","operators","operator","value","mikroOrmOp","mapOperator","assign","normalizedOp","$eq","$ne","$gt","$gte","$lt","$lte","$like","$not","$ilike","$in","$nin","Error","JSON","stringify","isBetweenValue","lower","upper","val","FilterQueryBuilder","repo","whereBuilder","buildFindOptions","query","mikroOrmFilter","filterQuery","paging","sorting","limit","undefined","offset","options","orderBy","reduce","acc","direction","nulls","order","orderValue","replace","applyFilter","qb","_alias","andWhere","applySorting","sorts","applyGroupBy","groupBy","applyAggregateSorting","createQueryBuilder","alias","getEntityAlias","em","getEntityManager","meta","getMetadata","get","getEntityName","className","filterHasRelations","getReferencedRelations","relationNames","referencedFields","getFilterFields","includes","getReferencedRelationsRecursive","metadataOrFilter","metadata","actualFilter","from","prev","curr","currFilterValue","subFilter","merge","getReferencedRelationsRecursiveInternal","referencedRelation","relations","find","r","name","nestedFilter","targetMeta","type","nestedRelations","ComparisonBuilder","cmp","normalizedCmp","isComparison","isNotComparison","checkNonEmptyArray","betweenComparison","notBetweenComparison","isBetweenVal","RelationQueryBuilder","filterQueryBuilder","relation","relationMeta","getRelationMeta","relationRepo","getRepository","selectAndExecute","entity","RelationEntity","baseWhere","buildWhereCondition","finalWhere","findOptions","count","aggregate","aggregateQuery","rows","aggs","makeAggKey","func","makeGroupKey","records","isNumeric","v","Date","out","computeField","fn","values","nums","getTime","Number","n","isNaN","sum","s","every","Math","max","a","b","String","min","avg","groups","Map","keyParts","g","join","arr","set","groupRows","parts","split","p","parse","i","entityMeta","relationEntityMeta","entityPrimaryKey","primaryKeys","relationPrimaryKey","entityId","kind","fkValue","entityAsRecord","fkFieldName","fieldNames","conventionalIdField","relationNameLower","entityKeys","matchingKey","keyLower","endsWith","base","relationValue","owner","joinColumns","inversedBy","mappedBy","relationProp","properties","entityIndexColName","getRelationPrimaryKeysPropertyNameAndColumnsName","pk","prop","propertyName","columnName","AGG_REGEXP","AggregateBuilder","buildSelectExpressions","groupBySelects","col","getGroupByAlias","funcSelects","fields","aliases","getAggregateAlias","selects","BadRequestException","asyncConvertToAggregateResponse","responsePromise","aggResponse","convertToAggregateResponse","getAggregateSelects","getAggregateGroupBySelects","getAggregateFuncSelects","cols","rawAggregates","response","agg","_id","idObj","k","m","exec","resultField","matchResult","matchedFunc","matchedFieldName","funcKey","aggFunc","fieldName","getColumnName","mainAlias","createGroupBySelect","createAggSelect","selectExpr","selectAlias","addSelect","raw","RelationQueryService","queryRelations","RelationClass","relationName","dto","batchQueryRelations","isRelationClassIdentity","relationQueryBuilder","getRelationQueryBuilder","assembler","AssemblerFactory","getAssembler","getRelationEntity","convertToDTOs","convertQuery","aggregateRelations","batchAggregateRelations","rawResults","convertAggregateQuery","res","convertAggregateResponse","countRelations","batchCountRelations","findRelation","opts","batchFindRelations","relationEntity","convertToDTO","addRelations","id","relationIds","getById","getRelations","relationFilter","foundAllRelations","EntityClass","wrap","flush","collection","add","setRelations","currentRelations","nextSet","getPrimaryKey","currentRelation","currentPk","init","setRelation","relationId","removeRelations","remove","removeRelation","assignData","ownDescriptor","getOwnPropertyDescriptor","protoDescriptor","getPrototypeOf","descriptor","canAssignFk","Boolean","writable","entities","bypassAssembler","convertedQuery","results","Promise","all","relationDtos","dtos","batchResults","class","ids","relationMetadata","primaryKey","idFilter","additionalFilter","size","MikroOrmQueryService","useSoftDelete","serializer","getAssemblerSerializer","AssemblerSerializer","e","json","instanceToPlain","enableImplicitConversion","excludeExtraneousValues","exposeDefaultValues","jsonWithRemovedEmptyObjects","fromEntries","entries","wrapped","ormJson","toObject","data","AssemblerDeserializer","d","create","where","deletedFilter","deletedAt","findById","additional","findOne","NotFoundException","createOne","record","ensureIsEntityAndDoesNotExist","persist","createMany","updateOne","update","toPOJO","dateWithClearUndefined","ensureIdIsNotPresent","updateMany","updatedCount","deleteOne","deleteMany","deletedCount","restoreOne","ensureSoftDeleteEnabled","whereClause","additionalWhere","filters","restoreMany","ensureEntityDoesNotExist","clear","found","MethodNotAllowedException","createMikroOrmQueryServiceProvider","contextName","provide","getQueryServiceToken","useFactory","inject","getRepositoryToken","createMikroOrmQueryServiceProviders","NestjsQueryMikroOrmModule","forFeature","queryServiceProviders","mikroOrmModule","MikroOrmModule","imports","module","providers","exports"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { FilterQuery } from '@mikro-orm/core';\nimport type {\n CommonFieldComparisonBetweenType,\n Filter,\n FilterComparisons,\n FilterFieldComparison,\n} from '@ptc-org/nestjs-query-core';\n\n/**\n * @internal\n * Builds a WHERE clause from a Filter for MikroORM.\n */\nexport class WhereBuilder<Entity> {\n /**\n * Builds a MikroORM FilterQuery from a nestjs-query Filter.\n * @param filter - the filter to build the WHERE clause from.\n */\n build(filter: Filter<Entity>): FilterQuery<Entity> {\n const { and, or } = filter;\n const conditions: FilterQuery<Entity>[] = [];\n\n // Handle AND conditions\n if (and && and.length) {\n const andConditions = and.map((f) => this.build(f as Filter<Entity>));\n conditions.push({ $and: andConditions } as FilterQuery<Entity>);\n }\n\n // Handle OR conditions\n if (or && or.length) {\n const orConditions = or.map((f) => this.build(f as Filter<Entity>));\n conditions.push({ $or: orConditions } as FilterQuery<Entity>);\n }\n\n // Handle field comparisons\n const fieldConditions = this.buildFieldComparisons(filter);\n if (Object.keys(fieldConditions).length > 0) {\n conditions.push(fieldConditions);\n }\n\n // Combine all conditions with $and if there are multiple\n if (conditions.length === 0) {\n return {} as FilterQuery<Entity>;\n }\n if (conditions.length === 1) {\n return conditions[0];\n }\n return { $and: conditions } as FilterQuery<Entity>;\n }\n\n /**\n * Known nestjs-query comparison operators\n */\n private readonly KNOWN_OPERATORS = new Set([\n 'eq',\n 'neq',\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'like',\n 'notlike',\n 'ilike',\n 'notilike',\n 'in',\n 'notin',\n 'is',\n 'isnot',\n 'between',\n 'notbetween',\n ]);\n\n /**\n * Check if an object contains comparison operators (not nested relation filters)\n */\n private isComparisonObject(obj: unknown): obj is FilterFieldComparison<unknown> {\n if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) {\n return false;\n }\n const keys = Object.keys(obj);\n // If the object has any known operator keys, treat it as a comparison\n return keys.some((key) => this.KNOWN_OPERATORS.has(key.toLowerCase()));\n }\n\n /**\n * Creates field comparisons from a filter. This method will ignore and/or properties.\n * @param filter - the filter with fields to create comparisons for.\n */\n private buildFieldComparisons(filter: Filter<Entity>): FilterQuery<Entity> {\n const result: Record<string, unknown> = {};\n\n Object.keys(filter).forEach((field) => {\n if (field !== 'and' && field !== 'or') {\n const comparison = (filter as FilterComparisons<Entity>)[\n field as keyof FilterComparisons<Entity>\n ] as FilterFieldComparison<unknown>;\n\n if (comparison) {\n // Check if this is a nested relation filter (object without known operators)\n if (typeof comparison === 'object' && !this.isComparisonObject(comparison)) {\n // This is a nested relation filter - recursively build it\n result[field] = this.build(comparison as unknown as Filter<Entity>);\n } else {\n result[field] = this.buildComparison(comparison);\n }\n }\n }\n });\n\n return result as FilterQuery<Entity>;\n }\n\n /**\n * Builds a MikroORM comparison from a nestjs-query FilterFieldComparison.\n * @param comparison - the comparison to convert.\n */\n private buildComparison<T>(comparison: FilterFieldComparison<T>): Record<string, unknown> {\n const conditions: Record<string, unknown> = {};\n\n const operators = Object.keys(comparison) as (keyof FilterFieldComparison<T>)[];\n\n for (const operator of operators) {\n const value = comparison[operator];\n const mikroOrmOp = this.mapOperator(operator as string, value);\n Object.assign(conditions, mikroOrmOp);\n }\n\n // If there are multiple conditions, combine with $and\n if (Object.keys(conditions).length === 1) {\n return conditions;\n }\n\n return conditions;\n }\n\n /**\n * Maps a nestjs-query operator to a MikroORM operator.\n * @param operator - the nestjs-query operator.\n * @param value - the value to compare.\n */\n private mapOperator(operator: string, value: unknown): Record<string, unknown> {\n const normalizedOp = operator.toLowerCase();\n\n switch (normalizedOp) {\n case 'eq':\n return { $eq: value };\n case 'neq':\n return { $ne: value };\n case 'gt':\n return { $gt: value };\n case 'gte':\n return { $gte: value };\n case 'lt':\n return { $lt: value };\n case 'lte':\n return { $lte: value };\n case 'like':\n return { $like: value };\n case 'notlike':\n // MikroORM doesn't have a $nlike operator, but $not can be used at the field level\n // However, for relation filtering, this syntax may not work\n // Use $re with regex negation if needed, or return as $not: $like\n // Actually, SQLite supports NOT LIKE directly, so we'll use a raw approach\n return { $not: { $like: value } };\n case 'ilike':\n return { $ilike: value };\n case 'notilike':\n return { $not: { $ilike: value } };\n case 'in':\n return { $in: value };\n case 'notin':\n return { $nin: value };\n case 'is':\n if (value === null) {\n return { $eq: null };\n }\n if (value === true) {\n return { $eq: true };\n }\n if (value === false) {\n return { $eq: false };\n }\n throw new Error(`Unexpected is operator param ${JSON.stringify(value)}`);\n case 'isnot':\n if (value === null) {\n return { $ne: null };\n }\n if (value === true) {\n return { $ne: true };\n }\n if (value === false) {\n return { $ne: false };\n }\n throw new Error(`Unexpected isNot operator param ${JSON.stringify(value)}`);\n case 'between':\n if (this.isBetweenValue(value)) {\n return { $gte: value.lower, $lte: value.upper };\n }\n throw new Error(\n `Invalid value for between expected {lower: val, upper: val} got ${JSON.stringify(value)}`,\n );\n case 'notbetween':\n if (this.isBetweenValue(value)) {\n return {\n $or: [{ $lt: value.lower }, { $gt: value.upper }],\n };\n }\n throw new Error(\n `Invalid value for not between expected {lower: val, upper: val} got ${JSON.stringify(value)}`,\n );\n default:\n throw new Error(`Unknown operator ${operator}`);\n }\n }\n\n private isBetweenValue(val: unknown): val is CommonFieldComparisonBetweenType<unknown> {\n return val !== null && typeof val === 'object' && 'lower' in val && 'upper' in val;\n }\n}\n","import type { EntityMetadata, EntityName, EntityRepository, FilterQuery } from '@mikro-orm/core';\nimport type { Filter, Query, SortField } from '@ptc-org/nestjs-query-core';\nimport { getFilterFields } from '@ptc-org/nestjs-query-core';\nimport merge from 'lodash.merge';\n\nimport { WhereBuilder } from './where.builder';\nimport type { QueryBuilder } from './types';\n\n/**\n * @internal\n *\n * Nested record type\n */\nexport interface NestedRecord<E = unknown> {\n [keys: string]: NestedRecord<E>;\n}\n\n/**\n * @internal\n *\n * Class that will convert a Query into a MikroORM Query Builder.\n */\nexport class FilterQueryBuilder<Entity extends object> {\n constructor(\n readonly repo: EntityRepository<Entity>,\n readonly whereBuilder: WhereBuilder<Entity> = new WhereBuilder<Entity>(),\n ) {}\n\n /**\n * NOTE: QueryBuilder-specific helpers removed; use `buildFindOptions` to\n * produce a filter and options for `em.find`/`repo.find`.\n */\n\n /**\n * Build a filter query and find options suitable for `em.find`/`repo.find` calls.\n * This keeps usage DB-agnostic by returning plain filter objects and options\n * instead of driver-specific QueryBuilder instances.\n */\n buildFindOptions(query: Query<Entity>): {\n filterQuery?: FilterQuery<Entity>;\n options?: { limit?: number; offset?: number; orderBy?: Record<string, unknown> };\n } {\n const result: {\n filterQuery?: FilterQuery<Entity>;\n options?: { limit?: number; offset?: number; orderBy?: Record<string, unknown> };\n } = {};\n\n if (query.filter) {\n const mikroOrmFilter = this.whereBuilder.build(query.filter) as FilterQuery<Entity>;\n result.filterQuery = mikroOrmFilter;\n }\n\n const paging = query.paging;\n const sorting = query.sorting;\n\n if (\n (paging && (paging.limit !== undefined || paging.offset !== undefined)) ||\n (sorting && sorting.length)\n ) {\n const options: { limit?: number; offset?: number; orderBy?: Record<string, unknown> } = {};\n if (paging) {\n if (paging.limit !== undefined) options.limit = paging.limit;\n if (paging.offset !== undefined) options.offset = paging.offset;\n }\n if (sorting && sorting.length > 0) {\n const orderBy = sorting.reduce(\n (acc, { field, direction, nulls }) => {\n const order = direction === 'ASC' ? 'asc' : 'desc';\n let orderValue: string | object = order;\n\n if (nulls) {\n orderValue = `${order} ${nulls.toLowerCase().replace('_', ' ')}`;\n }\n\n return { ...acc, [field]: orderValue };\n },\n {} as Record<string, unknown>,\n );\n options.orderBy = orderBy;\n }\n result.options = options;\n }\n\n return result;\n }\n\n /**\n * Applies the filter from a Query to a MikroORM QueryBuilder.\n *\n * @param qb - the MikroORM QueryBuilder.\n * @param filter - the filter.\n * @param _alias - optional alias to use to qualify an identifier (unused in MikroORM)\n */\n applyFilter<Q extends QueryBuilder<Entity>>(qb: Q, filter?: Filter<Entity>, _alias?: string): Q {\n if (!filter) {\n return qb;\n }\n const mikroOrmFilter = this.whereBuilder.build(filter);\n return qb.andWhere!(mikroOrmFilter as FilterQuery<Entity>) as Q;\n }\n\n /**\n * Applies the ORDER BY clause to a MikroORM QueryBuilder.\n * @param qb - the MikroORM QueryBuilder.\n * @param sorts - an array of SortFields to create the ORDER BY clause.\n * @param _alias - optional alias to use to qualify an identifier (unused in MikroORM)\n */\n applySorting<Q extends QueryBuilder<Entity>>(\n qb: Q,\n sorts?: SortField<Entity>[],\n _alias?: string,\n ): Q {\n if (!sorts || sorts.length === 0) {\n return qb;\n }\n\n const orderBy = sorts.reduce(\n (acc, { field, direction, nulls }) => {\n const order = direction === 'ASC' ? 'asc' : 'desc';\n let orderValue: string | object = order;\n\n if (nulls) {\n orderValue = `${order} ${nulls.toLowerCase().replace('_', ' ')}`;\n }\n\n return { ...acc, [field]: orderValue };\n },\n {} as Record<string, unknown>,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return qb.orderBy!(orderBy as any) as Q;\n }\n\n applyGroupBy<Q extends QueryBuilder<Entity>>(\n qb: Q,\n groupBy?: (keyof Entity)[],\n _alias?: string,\n ): Q {\n if (!groupBy || groupBy.length === 0) {\n return qb;\n }\n\n groupBy.forEach((field) => {\n qb.groupBy!(field as string);\n });\n\n return qb;\n }\n\n applyAggregateSorting<Q extends QueryBuilder<Entity>>(\n qb: Q,\n groupBy?: (keyof Entity)[],\n _alias?: string,\n ): Q {\n if (!groupBy || groupBy.length === 0) {\n return qb;\n }\n\n const orderBy = groupBy.reduce(\n (acc, field) => ({\n ...acc,\n [field]: 'asc',\n }),\n {} as Record<string, string>,\n );\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return qb.orderBy!(orderBy as any) as Q;\n }\n\n /**\n * Create a MikroORM QueryBuilder.\n */\n private createQueryBuilder(alias?: string): QueryBuilder<Entity> {\n // `EntityRepository` typings may vary across MikroORM packages; use `any` at\n // the callsite to access the runtime helper without a hard dependency on\n // driver's repository type declarations.\n return (\n this.repo as unknown as { createQueryBuilder?: (alias?: string) => QueryBuilder<Entity> }\n ).createQueryBuilder?.(alias) as QueryBuilder<Entity>;\n }\n\n /**\n * Gets the entity alias based on the entity name.\n */\n private getEntityAlias(): string {\n const em = this.repo.getEntityManager();\n const meta = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return meta.className;\n }\n\n /**\n * Checks if a filter references any relations.\n * @param filter\n * @private\n *\n * @returns true if there are any referenced relations\n */\n filterHasRelations(filter?: Filter<Entity>): boolean {\n if (!filter) {\n return false;\n }\n return this.getReferencedRelations(filter).length > 0;\n }\n\n private getReferencedRelations(filter: Filter<Entity>): string[] {\n const relationNames = this.relationNames;\n const referencedFields = getFilterFields(filter);\n return referencedFields.filter((f) => relationNames.includes(f));\n }\n\n getReferencedRelationsRecursive(\n metadataOrFilter: EntityMetadata<Entity> | Filter<unknown> = {},\n filter?: Filter<unknown>,\n ): NestedRecord {\n const em = this.repo.getEntityManager();\n // Handle both signatures: (metadata, filter) and (filter)\n let metadata: EntityMetadata<Entity>;\n let actualFilter: Filter<unknown>;\n\n if (filter !== undefined) {\n // Called as (metadata, filter)\n metadata = metadataOrFilter as EntityMetadata<Entity>;\n actualFilter = filter;\n } else if ('properties' in metadataOrFilter || 'relations' in metadataOrFilter) {\n // First arg looks like metadata, but no second arg - treat as empty filter\n metadata = metadataOrFilter as EntityMetadata<Entity>;\n actualFilter = {};\n } else {\n // Called as (filter) - backward compatible\n metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n actualFilter = metadataOrFilter as Filter<unknown>;\n }\n\n const referencedFields = Array.from(\n new Set(Object.keys(actualFilter) as (keyof Filter<unknown>)[]),\n );\n return referencedFields.reduce((prev, curr) => {\n const currFilterValue = actualFilter[curr];\n if ((curr === 'and' || curr === 'or') && currFilterValue) {\n for (const subFilter of currFilterValue as Filter<unknown>[]) {\n prev = merge(prev, this.getReferencedRelationsRecursiveInternal(metadata, subFilter));\n }\n }\n const referencedRelation = metadata.relations.find((r) => r.name === curr);\n if (!referencedRelation) return prev;\n\n // Get nested relations recursively\n const nestedFilter = currFilterValue as Filter<unknown>;\n const targetMeta = em\n .getMetadata()\n .get(referencedRelation.type as unknown as EntityName<any>);\n const nestedRelations = nestedFilter\n ? this.getReferencedRelationsRecursiveInternal(targetMeta, nestedFilter)\n : {};\n\n return {\n ...prev,\n [curr]: merge((prev as NestedRecord)[curr] ?? {}, nestedRelations),\n };\n }, {});\n }\n\n private getReferencedRelationsRecursiveInternal(\n metadata: EntityMetadata<Entity>,\n filter: Filter<unknown> = {},\n ): NestedRecord {\n const em = this.repo.getEntityManager();\n const referencedFields = Array.from(new Set(Object.keys(filter) as (keyof Filter<unknown>)[]));\n return referencedFields.reduce((prev, curr) => {\n const currFilterValue = filter[curr];\n if ((curr === 'and' || curr === 'or') && currFilterValue) {\n for (const subFilter of currFilterValue as Filter<unknown>[]) {\n prev = merge(prev, this.getReferencedRelationsRecursiveInternal(metadata, subFilter));\n }\n }\n const referencedRelation = metadata.relations.find((r) => r.name === curr);\n if (!referencedRelation) return prev;\n\n // Get nested relations recursively\n const nestedFilter = currFilterValue as Filter<unknown>;\n const targetMeta = em\n .getMetadata()\n .get(referencedRelation.type as unknown as EntityName<any>);\n const nestedRelations = nestedFilter\n ? this.getReferencedRelationsRecursiveInternal(targetMeta, nestedFilter)\n : {};\n\n return {\n ...prev,\n [curr]: merge((prev as NestedRecord)[curr] ?? {}, nestedRelations),\n };\n }, {});\n }\n\n private get relationNames(): string[] {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return metadata.relations.map((r) => r.name);\n }\n}\n","import type {\n CommonFieldComparisonBetweenType,\n FilterComparisonOperators,\n} from '@ptc-org/nestjs-query-core';\n\n/**\n * @internal\n */\nexport type EntityComparisonField<Entity, F extends keyof Entity> =\n | Entity[F]\n | Entity[F][]\n | CommonFieldComparisonBetweenType<Entity[F]>\n | true\n | false\n | null;\n\n/**\n * @internal\n * Maps nestjs-query comparison operators to MikroORM operators.\n * This is a simplified version since MikroORM uses object-based filters.\n */\nexport class ComparisonBuilder<Entity> {\n /**\n * Maps a comparison operator to MikroORM filter format.\n *\n * @param field - the property in Entity to create the comparison for.\n * @param cmp - the FilterComparisonOperator (eq, neq, gt, etc...)\n * @param val - the value to compare to\n */\n build<F extends keyof Entity>(\n field: F,\n cmp: FilterComparisonOperators<Entity[F]>,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n const normalizedCmp = (cmp as string).toLowerCase();\n\n switch (normalizedCmp) {\n case 'eq':\n return { [field]: { $eq: val } };\n case 'neq':\n return { [field]: { $ne: val } };\n case 'gt':\n return { [field]: { $gt: val } };\n case 'gte':\n return { [field]: { $gte: val } };\n case 'lt':\n return { [field]: { $lt: val } };\n case 'lte':\n return { [field]: { $lte: val } };\n case 'like':\n return { [field]: { $like: val } };\n case 'notlike':\n return { [field]: { $not: { $like: val } } };\n case 'ilike':\n return { [field]: { $ilike: val } };\n case 'notilike':\n return { [field]: { $not: { $ilike: val } } };\n case 'is':\n return this.isComparison(field, val);\n case 'isnot':\n return this.isNotComparison(field, val);\n case 'in':\n this.checkNonEmptyArray(val);\n return { [field]: { $in: val } };\n case 'notin':\n this.checkNonEmptyArray(val);\n return { [field]: { $nin: val } };\n case 'between':\n return this.betweenComparison(field, val);\n case 'notbetween':\n return this.notBetweenComparison(field, val);\n default:\n throw new Error(`Unknown operator ${JSON.stringify(cmp)}`);\n }\n }\n\n private isComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (val === null) {\n return { [field]: { $eq: null } };\n }\n if (val === true) {\n return { [field]: { $eq: true } };\n }\n if (val === false) {\n return { [field]: { $eq: false } };\n }\n throw new Error(`Unexpected is operator param ${JSON.stringify(val)}`);\n }\n\n private isNotComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (val === null) {\n return { [field]: { $ne: null } };\n }\n if (val === true) {\n return { [field]: { $ne: true } };\n }\n if (val === false) {\n return { [field]: { $ne: false } };\n }\n throw new Error(`Unexpected isNot operator param ${JSON.stringify(val)}`);\n }\n\n private checkNonEmptyArray<F extends keyof Entity>(val: EntityComparisonField<Entity, F>): void {\n if (!Array.isArray(val)) {\n throw new Error(`Invalid in value expected an array got ${JSON.stringify(val)}`);\n }\n if (!val.length) {\n throw new Error(`Invalid in value expected a non-empty array got ${JSON.stringify(val)}`);\n }\n }\n\n private betweenComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (this.isBetweenVal(val)) {\n return {\n [field]: {\n $gte: val.lower,\n $lte: val.upper,\n },\n };\n }\n throw new Error(\n `Invalid value for between expected {lower: val, upper: val} got ${JSON.stringify(val)}`,\n );\n }\n\n private notBetweenComparison<F extends keyof Entity>(\n field: F,\n val: EntityComparisonField<Entity, F>,\n ): Record<string, unknown> {\n if (this.isBetweenVal(val)) {\n return {\n $or: [{ [field]: { $lt: val.lower } }, { [field]: { $gt: val.upper } }],\n };\n }\n throw new Error(\n `Invalid value for not between expected {lower: val, upper: val} got ${JSON.stringify(val)}`,\n );\n }\n\n private isBetweenVal<F extends keyof Entity>(\n val: EntityComparisonField<Entity, F>,\n ): val is CommonFieldComparisonBetweenType<Entity[F]> {\n return val !== null && typeof val === 'object' && 'lower' in val && 'upper' in val;\n }\n}\n","import type { EntityName, EntityProperty, EntityRepository, FilterQuery } from '@mikro-orm/core';\nimport type { AggregateQuery, Query } from '@ptc-org/nestjs-query-core';\n\nimport { FilterQueryBuilder } from './filter-query.builder';\n\nexport type EntityIndexRelation<Relation> = Relation & {\n __nestjsQuery__entityIndex__: number;\n};\n\n/**\n * @internal\n *\n * Class that will convert a Query into a MikroORM Query Builder for relations.\n */\nexport class RelationQueryBuilder<Entity extends object, Relation extends object> {\n readonly filterQueryBuilder: FilterQueryBuilder<Relation>;\n\n constructor(\n readonly repo: EntityRepository<Entity>,\n readonly relation: string,\n ) {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const relationRepo = em.getRepository(\n relationMeta.type as unknown as EntityName<Relation>,\n ) as unknown as EntityRepository<Relation>;\n this.filterQueryBuilder = new FilterQueryBuilder<Relation>(relationRepo);\n }\n\n /**\n * Executes a relation select using `em.find` so the implementation is database-agnostic.\n */\n async selectAndExecute(entity: Entity, query: Query<Relation>): Promise<Relation[]> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const RelationEntity = relationMeta.type as string;\n\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery, options } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n\n const findOptions: Record<string, unknown> = {};\n if (options?.orderBy) findOptions.orderBy = options.orderBy;\n if (options?.limit !== undefined) findOptions.limit = options.limit;\n if (options?.offset !== undefined) findOptions.offset = options.offset;\n\n // Use em.find to fetch relations directly; this is database-agnostic and avoids QueryBuilder\n return (await em.find(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n findOptions as Record<string, unknown>,\n )) as Relation[];\n }\n\n async count(entity: Entity, query: Query<Relation>): Promise<number> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n const RelationEntity = relationMeta.type as string;\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n return em.count(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n );\n }\n\n async aggregate(\n entity: Entity,\n query: Query<Relation>,\n aggregateQuery: AggregateQuery<Relation>,\n ): Promise<Record<string, unknown>[]> {\n const relationMeta = this.getRelationMeta();\n const em = this.repo.getEntityManager();\n\n // Database-agnostic aggregate: fetch matching relations and compute aggregates in-memory\n const RelationEntity = relationMeta.type as string;\n const baseWhere = this.buildWhereCondition(entity, relationMeta) as FilterQuery<Relation>;\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions(\n query as unknown as Query<Relation>,\n );\n const finalWhere = filterQuery\n ? ({ $and: [baseWhere, filterQuery] } as FilterQuery<Relation>)\n : baseWhere;\n\n // fetch all matching relations (no paging)\n const rows = (await em.find(\n RelationEntity as unknown as EntityName<any>,\n finalWhere as unknown as FilterQuery<Relation>,\n )) as unknown[];\n\n // compute aggregates in-memory\n const aggs = aggregateQuery;\n const groupBy = aggs.groupBy ?? [];\n\n type RawAgg = Record<string, unknown>;\n const makeAggKey = (func: string, field: string) => `${func}_${field}`;\n const makeGroupKey = (field: string) => `GROUP_BY_${field}`;\n\n const records: RawAgg[] = [];\n\n const isNumeric = (v: unknown) => typeof v === 'number' || v instanceof Date;\n\n if (groupBy.length === 0) {\n const out: RawAgg = {};\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = rows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n // SUM and AVG only for numeric values\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] = fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Relation) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Relation) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Relation) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Relation) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Relation) => computeField('MIN', String(f)));\n\n records.push(out);\n } else {\n // Group rows by groupBy fields values\n const groups = new Map<string, unknown[]>();\n rows.forEach((r) => {\n const keyParts = groupBy.map((g) =>\n JSON.stringify((r as Record<string, unknown>)[String(g)]),\n );\n const key = keyParts.join('|');\n const arr = groups.get(key) ?? [];\n arr.push(r);\n groups.set(key, arr);\n });\n\n groups.forEach((groupRows, key) => {\n const parts = key.split('|').map((p) => JSON.parse(p));\n const out: RawAgg = {};\n groupBy.forEach((g, i) => {\n const val = parts[i];\n // Normalize boolean group values to 0/1 to match SQL behavior in tests\n out[makeGroupKey(String(g))] = typeof val === 'boolean' ? (val ? 1 : 0) : val;\n });\n\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = groupRows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] =\n fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Relation) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Relation) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Relation) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Relation) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Relation) => computeField('MIN', String(f)));\n\n records.push(out);\n });\n }\n\n return records;\n }\n\n private buildWhereCondition(\n entity: Entity,\n relationMeta: EntityProperty<Entity>,\n ): Record<string, unknown> {\n const em = this.repo.getEntityManager();\n const entityMeta = em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationEntityMeta = em\n .getMetadata()\n .get(relationMeta.type as unknown as EntityName<any>);\n const entityPrimaryKey = entityMeta.primaryKeys[0];\n const relationPrimaryKey = relationEntityMeta.primaryKeys[0];\n const entityId = (entity as Record<string, unknown>)[entityPrimaryKey];\n\n // Determine the relation type and build appropriate condition\n if (relationMeta.kind === 'm:1') {\n // Many-to-One: The foreign key is on the current entity\n // Try to get FK from multiple sources in order of preference\n let fkValue: unknown;\n const entityAsRecord = entity as Record<string, unknown>;\n\n // 1. Try the auto-generated FK field (e.g., test_entity_uni_directional_test_entity_pk)\n const fkFieldName = relationMeta.fieldNames?.[0];\n if (fkFieldName) {\n fkValue = entityAsRecord[fkFieldName];\n }\n\n // 2. If FK field not set, try common property naming pattern (e.g., testEntityId for testEntity relation)\n if (fkValue === undefined) {\n // Try relationName + 'Id'\n const conventionalIdField = `${relationMeta.name}Id`;\n fkValue = entityAsRecord[conventionalIdField];\n }\n\n // 3. If still undefined, try case-insensitive search for property matching relation name + Id\n // This handles cases where plain objects have properties like 'testEntityId' for 'testEntity' relation\n // or 'uniDirectionalTestEntityId' for 'testEntityUniDirectional' relation\n if (fkValue === undefined) {\n const relationNameLower = relationMeta.name.toLowerCase();\n const entityKeys = Object.keys(entityAsRecord);\n // Look for any property that ends with the relation name (case-insensitive) + Id\n const matchingKey = entityKeys.find((key) => {\n const keyLower = key.toLowerCase();\n if (keyLower === 'id' || !keyLower.endsWith('id')) {\n return false;\n }\n const base = keyLower.replace(/id$/, '');\n if (!base) {\n return false;\n }\n return relationNameLower.includes(base);\n });\n if (matchingKey) {\n fkValue = entityAsRecord[matchingKey];\n }\n }\n\n // 4. If still undefined, try getting it from the loaded relation object\n if (fkValue === undefined) {\n const relationValue = entityAsRecord[relationMeta.name];\n if (typeof relationValue === 'object' && relationValue !== null) {\n fkValue = (relationValue as Record<string, unknown>)[relationPrimaryKey];\n } else {\n fkValue = relationValue;\n }\n }\n\n return { [relationPrimaryKey]: fkValue };\n }\n\n if (relationMeta.kind === '1:1') {\n // One-to-One: Depends on which side owns the relationship\n if (relationMeta.owner) {\n // We own the FK, but we might not have it loaded\n // Try multiple approaches to get the FK value:\n\n // 1. Try the FK field (e.g., one_test_relation_test_relation_pk)\n const fkFieldName = relationMeta.joinColumns?.[0] || relationMeta.fieldNames?.[0];\n let fkValue: unknown;\n\n if (fkFieldName) {\n fkValue = (entity as Record<string, unknown>)[fkFieldName];\n }\n\n // 2. If FK field not set, try getting it from the loaded relation object\n if (fkValue === undefined) {\n const relationValue = (entity as Record<string, unknown>)[relationMeta.name];\n if (typeof relationValue === 'object' && relationValue !== null) {\n fkValue = (relationValue as Record<string, unknown>)[relationPrimaryKey];\n } else {\n fkValue = relationValue;\n }\n }\n\n // 3. If still undefined, we need to query via the inverse side\n // Query where the relation's inverse property matches our PK\n if (fkValue === undefined && relationMeta.inversedBy) {\n return { [relationMeta.inversedBy]: entityId };\n }\n\n return { [relationPrimaryKey]: fkValue };\n } else {\n // The other side owns the FK, so query where their FK matches our PK\n return { [relationMeta.mappedBy!]: entityId };\n }\n }\n\n if (relationMeta.kind === '1:m') {\n // One-to-Many: The foreign key is on the related entity\n const mappedBy = relationMeta.mappedBy;\n return { [mappedBy!]: entityId };\n }\n\n if (relationMeta.kind === 'm:n') {\n // Many-to-Many: Need to query through the pivot table\n // MikroORM handles this automatically through the relation\n if (relationMeta.owner) {\n return { [relationMeta.inversedBy!]: entityId };\n } else {\n return { [relationMeta.mappedBy!]: entityId };\n }\n }\n\n // Default case for other relation types\n return { [entityPrimaryKey]: entityId };\n }\n\n private getRelationMeta(): EntityProperty<Entity> {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationProp = metadata.properties[this.relation];\n\n if (!relationProp) {\n throw new Error(`Unable to find relation '${this.relation}' on entity`);\n }\n\n return relationProp as EntityProperty<Entity>;\n }\n\n get entityIndexColName(): string {\n return '__nestjsQuery__entityIndex__';\n }\n\n getRelationPrimaryKeysPropertyNameAndColumnsName(): {\n columnName: string;\n propertyName: string;\n }[] {\n const em = this.repo.getEntityManager();\n const relationMeta = this.getRelationMeta();\n const relationEntityMeta = em\n .getMetadata()\n .get(relationMeta.type as unknown as EntityName<any>);\n\n return relationEntityMeta.primaryKeys.map((pk) => {\n const prop = relationEntityMeta.properties[pk];\n return {\n propertyName: pk,\n columnName: prop.fieldNames?.[0] || pk,\n };\n });\n }\n}\n","import type { EntityMetadata } from '@mikro-orm/core';\nimport { raw } from '@mikro-orm/core';\nimport { BadRequestException } from '@nestjs/common';\nimport type { AggregateQuery, AggregateResponse } from '@ptc-org/nestjs-query-core';\nimport type { QueryBuilder } from './types';\n\nenum AggregateFuncs {\n AVG = 'AVG',\n SUM = 'SUM',\n COUNT = 'COUNT',\n MAX = 'MAX',\n MIN = 'MIN',\n}\n\n// Matches aggregate column prefixes in a case-insensitive way and multiple naming styles\nconst AGG_REGEXP =\n /^(AVG|SUM|COUNT|MAX|MIN|GROUP_BY|group_by|groupBy|avg|sum|count|max|min)_(.*)$/i;\n\n/**\n * @internal\n * Builds aggregate queries for MikroORM.\n */\nexport class AggregateBuilder<Entity extends object> {\n static buildSelectExpressions<Entity>(\n aggregate: AggregateQuery<Entity>,\n alias?: string,\n ): [string, string][] {\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, aggregate.count as any],\n [AggregateFuncs.SUM, aggregate.sum as any],\n [AggregateFuncs.AVG, aggregate.avg as any],\n [AggregateFuncs.MAX, aggregate.max as any],\n [AggregateFuncs.MIN, aggregate.min as any],\n ];\n\n const groupBySelects: [string, string][] = (aggregate.groupBy ?? []).map((f) => {\n const col = alias ? `\\`${alias}\\`.\\`${String(f)}\\`` : `\\`${String(f)}\\``;\n return [col, AggregateBuilder.getGroupByAlias(f as never)];\n });\n\n const funcSelects: [string, string][] = [];\n // Only create selects for aggregate functions that actually have fields\n aggs.forEach(([func, fields]) => {\n if (!fields || fields.length === 0) return;\n const aliases = fields.map((f) => {\n const col = alias ? `\\`${alias}\\`.\\`${String(f)}\\`` : `\\`${String(f)}\\``;\n return [`${func}(${col})`, AggregateBuilder.getAggregateAlias(func, f)];\n });\n funcSelects.push(...(aliases as [string, string][]));\n });\n\n const selects = [...groupBySelects, ...funcSelects];\n if (!selects.length) {\n throw new BadRequestException('No aggregate fields found.');\n }\n return selects;\n }\n static async asyncConvertToAggregateResponse<Entity>(\n responsePromise: Promise<Record<string, unknown>[]>,\n ): Promise<AggregateResponse<Entity>[]> {\n const aggResponse = await responsePromise;\n return this.convertToAggregateResponse(aggResponse);\n }\n\n static getAggregateSelects<Entity>(query: AggregateQuery<Entity>): string[] {\n return [...this.getAggregateGroupBySelects(query), ...this.getAggregateFuncSelects(query)];\n }\n\n private static getAggregateGroupBySelects<Entity>(query: AggregateQuery<Entity>): string[] {\n return (query.groupBy ?? []).map((f) => this.getGroupByAlias(f as never));\n }\n\n private static getAggregateFuncSelects<Entity>(query: AggregateQuery<Entity>): string[] {\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, query.count as any],\n [AggregateFuncs.SUM, query.sum as any],\n [AggregateFuncs.AVG, query.avg as any],\n [AggregateFuncs.MAX, query.max as any],\n [AggregateFuncs.MIN, query.min as any],\n ];\n return aggs.reduce((cols, [func, fields]) => {\n if (!fields || fields.length === 0) return cols;\n const aliases = fields.map((f) => this.getAggregateAlias(func, f));\n return [...cols, ...aliases];\n }, [] as string[]);\n }\n\n static getAggregateAlias<Entity>(func: AggregateFuncs, field: keyof Entity): string {\n return `${func}_${field as string}`;\n }\n\n static getGroupByAlias<Entity>(field: keyof Entity): string {\n return `GROUP_BY_${field as string}`;\n }\n\n static convertToAggregateResponse<Entity>(\n rawAggregates: Record<string, unknown>[],\n ): AggregateResponse<Entity>[] {\n return rawAggregates.map((response) => {\n const agg: AggregateResponse<Entity> = {} as AggregateResponse<Entity>;\n\n // Handle Mongo-style grouped _id object (e.g. _id: { group_by_field: value })\n if (response._id && typeof response._id === 'object') {\n const idObj = response._id as Record<string, unknown>;\n Object.keys(idObj).forEach((k) => {\n const m = /^(?:GROUP_BY|group_by|groupBy)_(.*)$/i.exec(k);\n if (m) {\n const field = m[1] as keyof Entity;\n agg.groupBy = { ...(agg.groupBy as Record<string, unknown>), [field]: idObj[k] } as any;\n }\n });\n }\n\n Object.keys(response).forEach((resultField) => {\n if (resultField === '_id') return;\n\n const matchResult = AGG_REGEXP.exec(resultField);\n if (!matchResult) {\n throw new Error('Unknown aggregate column encountered.');\n }\n const matchedFunc = matchResult[1];\n const matchedFieldName = matchResult[2];\n const funcKey = matchedFunc.toLowerCase();\n // normalize to aggregate response keys: count, sum, avg, max, min\n const aggFunc = (\n funcKey === 'group_by' || funcKey === 'groupby' ? 'groupBy' : funcKey\n ) as keyof AggregateResponse<Entity>;\n if (aggFunc === 'groupBy') {\n // If group_by leaked into top-level, set it on groupBy\n agg.groupBy = {\n ...(agg.groupBy as Record<string, unknown>),\n [matchedFieldName]: response[resultField],\n } as any;\n return;\n }\n\n const fieldName = matchedFieldName as keyof Entity;\n agg[aggFunc] = {\n ...(agg[aggFunc] as Record<string, unknown>),\n [fieldName]: response[resultField],\n } as any;\n });\n\n return agg;\n });\n }\n\n /**\n * Gets the actual database column name for a property from entity metadata.\n * @param metadata - the entity metadata\n * @param propertyName - the property name\n * @returns the database column name\n */\n private getColumnName(metadata: EntityMetadata<Entity>, propertyName: string): string {\n const prop = metadata.properties[propertyName as keyof (typeof metadata)['properties']];\n if (prop && prop.fieldNames && prop.fieldNames.length > 0) {\n return prop.fieldNames[0];\n }\n return propertyName; // fallback to property name if not found\n }\n\n /**\n * Builds aggregate SELECT clause for MikroORM QueryBuilder.\n * @param qb - the MikroORM QueryBuilder\n * @param aggregate - the aggregates to select.\n * @param alias - optional alias to use to qualify an identifier\n */\n build<Qb extends QueryBuilder<Entity>>(\n qb: Qb,\n aggregate: AggregateQuery<Entity>,\n alias?: string,\n ): Qb {\n // Get entity metadata for column name resolution via the qb's internal helper\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const metadata: EntityMetadata<Entity> | undefined = (qb as any).mainAlias?.metadata;\n\n const selects: [string, string][] = [];\n // Group by selects\n selects.push(...this.createGroupBySelect(aggregate.groupBy as any, alias, metadata));\n\n // Only add aggregate selects for functions that were requested\n const aggs: [AggregateFuncs, (keyof Entity)[] | undefined][] = [\n [AggregateFuncs.COUNT, aggregate.count as any],\n [AggregateFuncs.SUM, aggregate.sum as any],\n [AggregateFuncs.AVG, aggregate.avg as any],\n [AggregateFuncs.MAX, aggregate.max as any],\n [AggregateFuncs.MIN, aggregate.min as any],\n ];\n aggs.forEach(([func, fields]) => {\n if (!fields || fields.length === 0) return;\n selects.push(...this.createAggSelect(func, fields, alias, metadata));\n });\n if (!selects.length) {\n throw new BadRequestException('No aggregate fields found.');\n }\n\n // Use MikroORM's raw() and addSelect() to avoid finalizing the QueryBuilder\n selects.forEach(([selectExpr, selectAlias]) => {\n qb.addSelect!(raw(`${selectExpr} as \"${selectAlias}\"`));\n });\n\n return qb;\n }\n\n private createAggSelect(\n func: AggregateFuncs,\n fields?: (keyof Entity)[],\n alias?: string,\n metadata?: EntityMetadata<Entity>,\n ): [string, string][] {\n if (!fields) {\n return [];\n }\n return fields.map((field) => {\n // Get the actual database column name from metadata\n const columnName = metadata\n ? this.getColumnName(metadata, field as string)\n : (field as string);\n const col = alias ? `\\`${alias}\\`.\\`${columnName}\\`` : `\\`${columnName}\\``;\n return [`${func}(${col})`, AggregateBuilder.getAggregateAlias(func, field)];\n });\n }\n\n private createGroupBySelect(\n fields?: (keyof Entity)[],\n alias?: string,\n metadata?: EntityMetadata<Entity>,\n ): [string, string][] {\n if (!fields) {\n return [];\n }\n return fields.map((field) => {\n // Get the actual database column name from metadata\n const columnName = metadata\n ? this.getColumnName(metadata, field as string)\n : (field as string);\n const col = alias ? `\\`${alias}\\`.\\`${columnName}\\`` : `\\`${columnName}\\``;\n return [`${col}`, AggregateBuilder.getGroupByAlias(field)];\n });\n }\n}\n","import type {\n Collection,\n EntityName,\n EntityProperty,\n EntityRepository,\n FilterQuery,\n} from '@mikro-orm/core';\nimport { wrap } from '@mikro-orm/core';\nimport type {\n AggregateQuery,\n AggregateResponse,\n Class,\n DeepPartial,\n Filter,\n FindRelationOptions,\n GetByIdOptions,\n ModifyRelationOptions,\n Query,\n} from '@ptc-org/nestjs-query-core';\nimport { AssemblerFactory } from '@ptc-org/nestjs-query-core';\n\nimport type { FilterQueryBuilder } from '../query/index';\nimport { AggregateBuilder, RelationQueryBuilder } from '../query/index';\n\ninterface RelationMetadata {\n kind: 'm:1' | '1:m' | '1:1' | 'm:n';\n type: string;\n entity: () => EntityName<unknown>;\n mappedBy?: string;\n}\n\n/**\n * Base class to house relations loading.\n * @internal\n */\nexport abstract class RelationQueryService<Entity extends object> {\n abstract filterQueryBuilder: FilterQueryBuilder<Entity>;\n\n abstract EntityClass: Class<Entity>;\n\n abstract repo: EntityRepository<Entity>;\n\n abstract getById(id: string | number, opts?: GetByIdOptions<Entity>): Promise<Entity>;\n\n /**\n * Query for an array of relations.\n * @param RelationClass - The class to serialize the relations into.\n * @param dto - The dto to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page and sort relations.\n */\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n query: Query<Relation>,\n ): Promise<Relation[]>;\n\n /**\n * Query for relations for an array of Entities. This method will return a map with the Entity as the key and the relations as the value.\n * @param RelationClass - The class of the relation.\n * @param relationName - The name of the relation to load.\n * @param entities - the dtos to find relations for.\n * @param query - A query to use to filter, page, and sort relations.\n */\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n query: Query<Relation>,\n ): Promise<Map<Entity, Relation[]>>;\n\n async queryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n query: Query<Relation>,\n ): Promise<Relation[] | Map<Entity, Relation[]>> {\n if (Array.isArray(dto)) {\n return this.batchQueryRelations(RelationClass, relationName, dto, query);\n }\n if (this.isRelationClassIdentity(RelationClass, relationName)) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return (await relationQueryBuilder.selectAndExecute(dto, query)) as Relation[];\n }\n\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return assembler.convertToDTOs(\n await relationQueryBuilder.selectAndExecute(dto, assembler.convertQuery(query)),\n );\n }\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<Map<Entity, AggregateResponse<Relation>[]>>;\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<AggregateResponse<Relation>[]>;\n\n async aggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<AggregateResponse<Relation>[] | Map<Entity, AggregateResponse<Relation>[]>> {\n if (Array.isArray(dto)) {\n return this.batchAggregateRelations(RelationClass, relationName, dto, filter, aggregate);\n }\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const rawResults = await relationQueryBuilder.aggregate(\n dto,\n assembler.convertQuery({ filter }),\n assembler.convertAggregateQuery(aggregate),\n );\n const aggResponse = AggregateBuilder.convertToAggregateResponse(rawResults);\n return aggResponse.map((agg) => {\n const res = assembler.convertAggregateResponse(agg);\n return res;\n });\n }\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n ): Promise<Map<Entity, number>>;\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n filter: Filter<Relation>,\n ): Promise<number>;\n\n async countRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n filter: Filter<Relation>,\n ): Promise<number | Map<Entity, number>> {\n if (Array.isArray(dto)) {\n return this.batchCountRelations(RelationClass, relationName, dto, filter);\n }\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n return relationQueryBuilder.count(dto, assembler.convertQuery({ filter }));\n }\n\n /**\n * Find a relation for an array of Entities. This will return a Map where the key is the Entity and the value is to\n * relation or undefined if not found.\n * @param RelationClass - the class of the relation\n * @param relationName - the name of the relation to load.\n * @param dtos - the dtos to find the relation for.\n * @param opts - Additional options\n */\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dtos: Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<Map<Entity, Relation | undefined>>;\n\n /**\n * Finds a single relation.\n * @param RelationClass - The class to serialize the relation into.\n * @param dto - The dto to find the relation for.\n * @param relationName - The name of the relation to query for.\n * @param opts - Additional options\n */\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity,\n opts?: FindRelationOptions<Relation>,\n ): Promise<Relation | undefined>;\n\n async findRelation<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dto: Entity | Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<(Relation | undefined) | Map<Entity, Relation | undefined>> {\n if (Array.isArray(dto)) {\n return this.batchFindRelations(RelationClass, relationName, dto, opts);\n }\n if (this.isRelationClassIdentity(RelationClass, relationName)) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const relations = await relationQueryBuilder.selectAndExecute(dto, {\n filter: opts?.filter,\n paging: { limit: 1 },\n });\n return relations[0] as Relation | undefined;\n }\n\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const relations = await relationQueryBuilder.selectAndExecute(dto, {\n filter: opts?.filter,\n paging: { limit: 1 },\n });\n const relationEntity = relations[0];\n return relationEntity ? assembler.convertToDTO(relationEntity) : undefined;\n }\n\n /**\n * Add a single relation.\n * @param id - The id of the entity to add the relation to.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of relations to add.\n * @param opts - Addition options\n */\n async addRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to add to ${this.EntityClass.name}`);\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: entity } as any);\n }\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and add relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.add === 'function') {\n for (const relation of relations) {\n collection.add(relation);\n }\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Set the relations on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of the relation to set on the entity. If the relationIds is empty all relations\n * will be removed.\n * @param opts - Additional options\n */\n async setRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (relationIds.length) {\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to set on ${this.EntityClass.name}`);\n }\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const currentRelations = await relationQueryBuilder.selectAndExecute(\n entity,\n {} as Query<Relation>,\n );\n const nextSet = new Set(relations.map((r) => (wrap(r as any) as any).getPrimaryKey()));\n\n for (const currentRelation of currentRelations) {\n const currentPk = (wrap(currentRelation as any) as any).getPrimaryKey();\n if (!nextSet.has(currentPk)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(currentRelation as any).assign({ [meta.mappedBy]: null } as any);\n }\n }\n\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: entity } as any);\n }\n\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and set relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.set === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n collection.set(relations);\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Set the relation on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationId - The id of the relation to set on the entity.\n * @param opts - Additional options\n */\n async setRelation<Relation extends object>(\n relationName: string,\n id: string | number,\n relationId: string | number,\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const relation = (\n await this.getRelations<Relation>(relationName, [relationId], opts?.relationFilter)\n )[0];\n if (!relation) {\n throw new Error(`Unable to find ${relationName} to set on ${this.EntityClass.name}`);\n }\n\n // Set the relation directly\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ [relationName]: relation } as any);\n await this.repo.getEntityManager().flush();\n\n return entity;\n }\n\n /**\n * Removes multiple relations.\n * @param id - The id of the entity to add the relation to.\n * @param relationName - The name of the relation to query for.\n * @param relationIds - The ids of the relations to add.\n * @param opts - Additional options\n */\n async removeRelations<Relation extends object>(\n relationName: string,\n id: string | number,\n relationIds: (string | number)[],\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const meta = this.getRelationMeta(relationName);\n const relations = await this.getRelations<Relation>(\n relationName,\n relationIds,\n opts?.relationFilter,\n );\n if (!this.foundAllRelations(relationIds, relations)) {\n throw new Error(`Unable to find all ${relationName} to remove from ${this.EntityClass.name}`);\n }\n\n if (meta.kind === '1:m' && meta.mappedBy) {\n for (const relation of relations) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: null } as any);\n }\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // Get the collection and remove relations\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.remove === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n for (const relation of relations) {\n collection.remove(relation);\n }\n await this.repo.getEntityManager().flush();\n }\n\n return entity;\n }\n\n /**\n * Remove the relation on the entity.\n *\n * @param id - The id of the entity to set the relation on.\n * @param relationName - The name of the relation to query for.\n * @param relationId - The id of the relation to set on the entity.\n */\n async removeRelation<Relation extends object>(\n relationName: string,\n id: string | number,\n relationId: string | number,\n opts?: ModifyRelationOptions<Entity, Relation>,\n ): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const relation = (\n await this.getRelations<Relation>(relationName, [relationId], opts?.relationFilter)\n )[0];\n if (!relation) {\n throw new Error(`Unable to find ${relationName} to remove from ${this.EntityClass.name}`);\n }\n const meta = this.getRelationMeta(relationName);\n if (meta.kind === '1:1' || meta.kind === 'm:1') {\n // For single relations, prefer nulling the explicit FK field when available.\n // This matches managed behavior where the relation object may remain attached in memory,\n // while the persisted FK value is cleared.\n const fkFieldName = `${relationName}Id`;\n const assignData: Record<string, null> = {};\n\n // Also clear the FK field if it exists on the entity\n const ownDescriptor = Object.getOwnPropertyDescriptor(entity, fkFieldName);\n const protoDescriptor = Object.getOwnPropertyDescriptor(\n Object.getPrototypeOf(entity),\n fkFieldName,\n );\n const descriptor = ownDescriptor ?? protoDescriptor;\n const canAssignFk =\n fkFieldName in (entity as Record<string, unknown>) &&\n (!descriptor || Boolean(descriptor.set) || descriptor.writable === true);\n\n if (canAssignFk) {\n assignData[fkFieldName] = null;\n } else {\n assignData[relationName] = null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign(assignData as any);\n } else {\n if (meta.kind === '1:m' && meta.mappedBy) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(relation as any).assign({ [meta.mappedBy]: null } as any);\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n // For collections, remove the relation\n const collection = (entity as Record<string, unknown>)[relationName] as Collection<Relation>;\n if (collection && typeof collection.remove === 'function') {\n // Initialize the collection before modifying it (MikroORM requirement)\n await collection.init();\n collection.remove(relation);\n }\n }\n\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n getRelationQueryBuilder<Relation extends object>(\n name: string,\n ): RelationQueryBuilder<Entity, Relation> {\n return new RelationQueryBuilder(this.repo, name);\n }\n\n /**\n * Query for an array of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchQueryRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n query: Query<Relation>,\n ): Promise<Map<Entity, Relation[]>> {\n const bypassAssembler = this.isRelationClassIdentity(RelationClass, relationName);\n const assembler = bypassAssembler\n ? undefined\n : AssemblerFactory.getAssembler(RelationClass, this.getRelationEntity(relationName));\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler ? assembler.convertQuery(query) : query;\n\n const results = new Map<Entity, Relation[]>();\n\n // Process each entity and collect its relations\n await Promise.all(\n entities.map(async (entity) => {\n const relations = await relationQueryBuilder.selectAndExecute(entity, convertedQuery);\n const relationDtos = bypassAssembler\n ? (relations as Relation[])\n : await assembler!.convertToDTOs(relations);\n // Only add to map if there are relations (undefined for entities with no relations)\n if (relationDtos.length > 0) {\n results.set(entity, relationDtos);\n }\n }),\n );\n\n return results;\n }\n\n /**\n * Query for an array of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchAggregateRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n aggregate: AggregateQuery<Relation>,\n ): Promise<Map<Entity, AggregateResponse<Relation>[]>> {\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler.convertQuery({ filter });\n\n const results = new Map<Entity, AggregateResponse<Relation>[]>();\n\n await Promise.all(\n entities.map(async (entity) => {\n const rawAggregates = await relationQueryBuilder.aggregate(\n entity,\n convertedQuery,\n assembler.convertAggregateQuery(aggregate),\n );\n const aggResponse = AggregateBuilder.convertToAggregateResponse(rawAggregates);\n results.set(\n entity,\n aggResponse.map((agg) => assembler.convertAggregateResponse(agg)),\n );\n }),\n );\n\n return results;\n }\n\n /**\n * Count the number of relations for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param entities - The entities to query relations for.\n * @param relationName - The name of relation to query for.\n * @param filter - The filter to apply to the relation query.\n */\n private async batchCountRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n entities: Entity[],\n filter: Filter<Relation>,\n ): Promise<Map<Entity, number>> {\n const assembler = AssemblerFactory.getAssembler(\n RelationClass,\n this.getRelationEntity(relationName),\n );\n const relationQueryBuilder = this.getRelationQueryBuilder<Relation>(relationName);\n const convertedQuery = assembler.convertQuery({ filter });\n\n const results = new Map<Entity, number>();\n\n await Promise.all(\n entities.map(async (entity) => {\n const count = await relationQueryBuilder.count(entity, convertedQuery);\n results.set(entity, count);\n }),\n );\n\n return results;\n }\n\n /**\n * Query for a relation for multiple dtos.\n * @param RelationClass - The class to serialize the relations into.\n * @param dtos - The dto to query relations for.\n * @param relationName - The name of relation to query for.\n * @param query - A query to filter, page or sort relations.\n */\n private async batchFindRelations<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n dtos: Entity[],\n opts?: FindRelationOptions<Relation>,\n ): Promise<Map<Entity, Relation | undefined>> {\n const batchResults = await this.batchQueryRelations(RelationClass, relationName, dtos, {\n paging: { limit: 1 },\n filter: opts?.filter,\n });\n const results = new Map<Entity, Relation | undefined>();\n // Only add entities that have matching relations to the map\n batchResults.forEach((relations, dto) => {\n // get just the first one\n if (relations?.[0]) {\n results.set(dto, relations[0]);\n }\n });\n return results;\n }\n\n private isRelationClassIdentity<Relation extends object>(\n RelationClass: Class<Relation>,\n relationName: string,\n ): boolean {\n const relationEntity = this.getRelationEntity(relationName) as Class<Relation>;\n return RelationClass === relationEntity || RelationClass.name === relationEntity.name;\n }\n\n private getRelationMeta(relationName: string): RelationMetadata {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const relationMeta = metadata.relations.find((r: EntityProperty) => r.name === relationName);\n if (!relationMeta) {\n throw new Error(`Unable to find relation ${relationName} on ${this.EntityClass.name}`);\n }\n return {\n kind: relationMeta.kind as 'm:1' | '1:m' | '1:1' | 'm:n',\n type: relationMeta.type,\n entity: relationMeta.entity,\n mappedBy: relationMeta.mappedBy,\n };\n }\n\n private getRelationEntity(relationName: string): Class<DeepPartial<unknown>> {\n const relationMeta = this.getRelationMeta(relationName);\n const entity = relationMeta.entity() as Class<DeepPartial<unknown>>;\n return entity && 'class' in entity ? (entity.class as Class<DeepPartial<unknown>>) : entity;\n }\n\n private async getRelations<Relation extends object>(\n relationName: string,\n ids: (string | number)[],\n filter?: Filter<Relation>,\n ): Promise<Relation[]> {\n const em = this.repo.getEntityManager();\n const relationMeta = this.getRelationMeta(relationName);\n const RelationEntity = relationMeta.entity() as EntityName<Relation>;\n const relationMetadata = em.getMetadata().get(RelationEntity);\n const primaryKey = relationMetadata.primaryKeys[0];\n\n // Build the filter with both the IDs and any additional filter\n const idFilter = { [primaryKey]: { $in: ids } } as FilterQuery<Relation>;\n\n if (filter) {\n // Combine with additional filter if provided\n const whereBuilder = this.filterQueryBuilder.whereBuilder;\n const additionalFilter = whereBuilder.build(\n filter as Filter<Entity>,\n ) as FilterQuery<Relation>;\n return em.find(RelationEntity, {\n $and: [idFilter, additionalFilter],\n } as any);\n }\n\n return em.find(RelationEntity, idFilter as any);\n }\n\n private foundAllRelations<Relation>(\n relationIds: (string | number)[],\n relations: Relation[],\n ): boolean {\n return new Set([...relationIds]).size === relations.length;\n }\n}\n","import type { EntityName, FilterQuery, RequiredEntityData } from '@mikro-orm/core';\nimport type { EntityRepository } from '@mikro-orm/core';\nimport type {\n AggregateQuery,\n AggregateResponse,\n Class,\n DeepPartial,\n DeleteManyResponse,\n DeleteOneOptions,\n Filter,\n Filterable,\n FindByIdOptions,\n GetByIdOptions,\n Query,\n QueryService,\n UpdateManyResponse,\n UpdateOneOptions,\n} from '@ptc-org/nestjs-query-core';\nimport { wrap } from '@mikro-orm/core';\nimport { AssemblerDeserializer, AssemblerSerializer } from '@ptc-org/nestjs-query-core';\nimport { getAssemblerSerializer } from '@ptc-org/nestjs-query-core/src/assemblers/assembler.serializer';\nimport { MethodNotAllowedException, NotFoundException } from '@nestjs/common';\nimport { instanceToPlain } from 'class-transformer';\n\nimport { AggregateBuilder, FilterQueryBuilder, WhereBuilder } from '../query';\nimport { RelationQueryService } from './relation-query.service';\n\nexport interface MikroOrmQueryServiceOpts<Entity extends object> {\n useSoftDelete?: boolean;\n filterQueryBuilder?: FilterQueryBuilder<Entity>;\n}\n\n/**\n * Base class for all query services that use a MikroORM EntityRepository.\n *\n * @example\n *\n * ```ts\n * @QueryService(TodoItemEntity)\n * export class TodoItemService extends MikroOrmQueryService<TodoItemEntity> {\n * constructor(\n * @InjectRepository(TodoItemEntity) repo: EntityRepository<TodoItemEntity>,\n * ) {\n * super(repo);\n * }\n * }\n * ```\n */\nexport class MikroOrmQueryService<Entity extends object>\n extends RelationQueryService<Entity>\n implements QueryService<Entity, DeepPartial<Entity>, DeepPartial<Entity>>\n{\n readonly filterQueryBuilder: FilterQueryBuilder<Entity>;\n\n readonly useSoftDelete: boolean;\n\n constructor(\n readonly repo: EntityRepository<Entity>,\n opts?: MikroOrmQueryServiceOpts<Entity>,\n ) {\n super();\n this.filterQueryBuilder = opts?.filterQueryBuilder ?? new FilterQueryBuilder<Entity>(this.repo);\n this.useSoftDelete = opts?.useSoftDelete ?? false;\n const serializer = getAssemblerSerializer(this.EntityClass);\n if (!serializer) {\n AssemblerSerializer((e: Entity) => {\n const json = instanceToPlain(e, {\n enableImplicitConversion: true,\n excludeExtraneousValues: true,\n exposeDefaultValues: true,\n });\n\n const jsonWithRemovedEmptyObjects = Object.fromEntries(\n Object.entries(json as object).filter(\n ([, value]) =>\n !(\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).length === 0\n ),\n ),\n );\n const wrapped = wrap(e, true);\n const ormJson = 'toObject' in wrapped ? wrapped.toObject() : {};\n\n const data = {\n ...ormJson,\n ...jsonWithRemovedEmptyObjects,\n };\n\n return data;\n })(this.EntityClass);\n AssemblerDeserializer((d: DeepPartial<Entity>) => {\n const wrapped = wrap(d, true);\n if (wrapped.getPrimaryKey()) {\n const entity = this.repo\n .getEntityManager()\n .merge(this.EntityClass, d as RequiredEntityData<Entity>) as Entity;\n return entity;\n } else {\n const entity = this.repo\n .getEntityManager()\n .create(this.EntityClass, d as RequiredEntityData<Entity>) as Entity;\n return entity;\n }\n })(this.EntityClass);\n }\n }\n\n get EntityClass(): Class<Entity> {\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n return metadata.class as Class<Entity>;\n }\n\n /**\n * Query for multiple entities, using a Query from `@ptc-org/nestjs-query-core`.\n *\n * @example\n * ```ts\n * const todoItems = await this.service.query({\n * filter: { title: { eq: 'Foo' } },\n * paging: { limit: 10 },\n * sorting: [{ field: \"create\", direction: SortDirection.DESC }],\n * });\n * ```\n * @param query - The Query used to filter, page, and sort rows.\n */\n async query(query: Query<Entity>): Promise<Entity[]> {\n const { filterQuery, options } = this.filterQueryBuilder.buildFindOptions(query);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n return em.find(this.EntityClass, where ?? {}, options as Record<string, unknown>);\n }\n\n async aggregate(\n filter: Filter<Entity>,\n aggregate: AggregateQuery<Entity>,\n ): Promise<AggregateResponse<Entity>[]> {\n // Build find options for the filter and fetch matching rows, then compute aggregates in-memory\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions({ filter } as Query<Entity>);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n const rows = (await em.find(this.EntityClass, where ?? {})) as unknown[];\n\n // Compute aggregates similar to RelationQueryBuilder (database-agnostic)\n const aggs = aggregate;\n const groupBy = aggs.groupBy ?? [];\n const records: Record<string, unknown>[] = [];\n const makeAggKey = (func: string, field: string) => `${func}_${field}`;\n const makeGroupKey = (field: string) => `GROUP_BY_${field}`;\n\n const isNumeric = (v: unknown) => typeof v === 'number' || v instanceof Date;\n\n if (groupBy.length === 0) {\n const out: Record<string, unknown> = {};\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = rows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] = fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n // Only add aggregate selects for functions that were requested\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Entity) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Entity) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Entity) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Entity) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Entity) => computeField('MIN', String(f)));\n\n records.push(out);\n } else {\n const groups = new Map<string, unknown[]>();\n rows.forEach((r) => {\n const key = groupBy\n .map((g) => JSON.stringify((r as Record<string, unknown>)[String(g)]))\n .join('|');\n const arr = groups.get(key) ?? [];\n arr.push(r);\n groups.set(key, arr);\n });\n\n groups.forEach((groupRows, key) => {\n const parts = key.split('|').map((p) => JSON.parse(p));\n const out: Record<string, unknown> = {};\n groupBy.forEach((g, i) => {\n const val = parts[i];\n out[makeGroupKey(String(g))] = typeof val === 'boolean' ? (val ? 1 : 0) : val;\n });\n\n const computeField = (fn: 'COUNT' | 'SUM' | 'AVG' | 'MAX' | 'MIN', field: string) => {\n const values = groupRows\n .map((r) => (r as Record<string, unknown>)[field])\n .filter((v) => v !== undefined && v !== null);\n if (fn === 'COUNT') {\n out[makeAggKey('COUNT', field)] = values.length;\n return;\n }\n if (values.length === 0) {\n out[makeAggKey(fn, field)] = null;\n return;\n }\n if (fn === 'SUM' || fn === 'AVG') {\n const nums = values\n .map((v) => (v instanceof Date ? v.getTime() : Number(v)))\n .filter((n) => !Number.isNaN(n));\n const sum = nums.reduce((s: number, v: number) => s + v, 0);\n out[makeAggKey(fn, field)] =\n fn === 'SUM' ? sum : nums.length ? sum / nums.length : null;\n return;\n }\n if (fn === 'MAX') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MAX', field)] = Math.max(...nums);\n } else {\n out[makeAggKey('MAX', field)] = values.reduce((a, b) =>\n String(a) > String(b) ? a : b,\n );\n }\n return;\n }\n if (fn === 'MIN') {\n if (values.every(isNumeric)) {\n const nums = values.map((v) => (v instanceof Date ? v.getTime() : Number(v)));\n out[makeAggKey('MIN', field)] = Math.min(...nums);\n } else {\n out[makeAggKey('MIN', field)] = values.reduce((a, b) =>\n String(a) < String(b) ? a : b,\n );\n }\n return;\n }\n };\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.count ?? []).forEach((f: keyof Entity) => computeField('COUNT', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.sum ?? []).forEach((f: keyof Entity) => computeField('SUM', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.avg ?? []).forEach((f: keyof Entity) => computeField('AVG', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.max ?? []).forEach((f: keyof Entity) => computeField('MAX', String(f)));\n // @ts-expect-error - TypeScript is not correctly inferring the types here\n (aggs.min ?? []).forEach((f: keyof Entity) => computeField('MIN', String(f)));\n\n records.push(out);\n });\n }\n\n return records.map((r) => AggregateBuilder.convertToAggregateResponse([r])[0]);\n }\n\n async count(filter: Filter<Entity>): Promise<number> {\n const { filterQuery } = this.filterQueryBuilder.buildFindOptions({ filter } as Query<Entity>);\n const em = this.repo.getEntityManager();\n let where: FilterQuery<Entity> | undefined = filterQuery as FilterQuery<Entity> | undefined;\n if (this.useSoftDelete) {\n const deletedFilter = { deletedAt: null } as FilterQuery<Entity>;\n where = where ? ({ $and: [where, deletedFilter] } as FilterQuery<Entity>) : deletedFilter;\n }\n return em.count(this.EntityClass, where ?? {});\n }\n\n /**\n * Find an entity by it's `id`.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.findById(1);\n * ```\n * @param id - The id of the record to find.\n */\n async findById(id: string | number, opts?: FindByIdOptions<Entity>): Promise<Entity | undefined> {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0] as keyof Entity;\n let where: FilterQuery<Entity> = { [primaryKey]: id } as FilterQuery<Entity>;\n if (opts?.filter) {\n const whereBuilder = new WhereBuilder<Entity>();\n const additional = whereBuilder.build(opts.filter);\n where = { $and: [where, additional] } as unknown as FilterQuery<Entity>;\n }\n if (this.useSoftDelete) {\n where = { $and: [where, { deletedAt: null }] } as unknown as FilterQuery<Entity>;\n }\n const entity = await this.em.findOne(this.EntityClass, where as FilterQuery<Entity>);\n return entity ?? undefined;\n }\n\n /**\n * Gets an entity by it's `id`. If the entity is not found a rejected promise is returned.\n *\n * @example\n * ```ts\n * try {\n * const todoItem = await this.service.getById(1);\n * } catch(e) {\n * console.error('Unable to find entity with id = 1');\n * }\n * ```\n * @param id - The id of the record to find.\n */\n async getById(id: string | number, opts?: GetByIdOptions<Entity>): Promise<Entity> {\n const entity = await this.findById(id, opts);\n if (!entity) {\n throw new NotFoundException(`Unable to find ${this.EntityClass.name} with id: ${id}`);\n }\n return entity;\n }\n\n /**\n * Creates a single entity.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.createOne({title: 'Todo Item', completed: false });\n * ```\n * @param record - The entity to create.\n */\n async createOne(record: DeepPartial<Entity>): Promise<Entity> {\n const entity = await this.ensureIsEntityAndDoesNotExist(record);\n await this.repo.getEntityManager().persist(entity).flush();\n return entity;\n }\n\n /**\n * Create multiple entities.\n *\n * @example\n * ```ts\n * const todoItem = await this.service.createMany([\n * {title: 'Todo Item 1', completed: false },\n * {title: 'Todo Item 2', completed: true },\n * ]);\n * ```\n * @param records - The entities to create.\n */\n async createMany(records: DeepPartial<Entity>[]): Promise<Entity[]> {\n const entities = await Promise.all(records.map((r) => this.ensureIsEntityAndDoesNotExist(r)));\n await this.repo.getEntityManager().persist(entities).flush();\n return entities;\n }\n\n /**\n * Update an entity.\n *\n * @example\n * ```ts\n * const updatedEntity = await this.service.updateOne(1, { completed: true });\n * ```\n * @param id - The `id` of the record.\n * @param update - A `Partial` of the entity with fields to update.\n * @param opts - Additional options.\n */\n async updateOne(\n id: number | string,\n update: DeepPartial<Entity>,\n opts?: UpdateOneOptions<Entity>,\n ): Promise<Entity> {\n const data = 'toPOJO' in wrap(update) ? wrap(update).toPOJO() : update;\n\n const dateWithClearUndefined = Object.fromEntries(\n Object.entries(data).filter(([, value]) => value !== undefined),\n ) as DeepPartial<Entity>;\n this.ensureIdIsNotPresent(dateWithClearUndefined);\n const entity = await this.getById(id, opts);\n\n wrap(entity).assign(dateWithClearUndefined as unknown as Partial<Entity> as any);\n await this.repo.getEntityManager().flush();\n return entity;\n }\n\n /**\n * Update multiple entities with a `@ptc-org/nestjs-query-core` Filter.\n *\n * @example\n * ```ts\n * const { updatedCount } = await this.service.updateMany(\n * { completed: true }, // the update to apply\n * { title: { eq: 'Foo Title' } } // Filter to find records to update\n * );\n * ```\n * @param update - A `Partial` of entity with the fields to update\n * @param filter - A Filter used to find the records to update\n */\n async updateMany(\n update: DeepPartial<Entity>,\n filter: Filter<Entity>,\n ): Promise<UpdateManyResponse> {\n const data = 'toPOJO' in wrap(update) ? wrap(update).toPOJO() : update;\n\n const dateWithClearUndefined = Object.fromEntries(\n Object.entries(data).filter(([, value]) => value !== undefined),\n ) as DeepPartial<Entity>;\n this.ensureIdIsNotPresent(update);\n\n // Get entities matching the filter\n const entities = await this.query({ filter });\n\n // Update each entity\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign(dateWithClearUndefined as any);\n }\n\n await this.repo.getEntityManager().flush();\n return { updatedCount: entities.length };\n }\n\n /**\n * Delete an entity by `id`.\n *\n * @example\n *\n * ```ts\n * const deletedTodo = await this.service.deleteOne(1);\n * ```\n *\n * @param id - The `id` of the entity to delete.\n * @param filter Additional filter to use when finding the entity to delete.\n */\n async deleteOne(id: string | number, opts?: DeleteOneOptions<Entity>): Promise<Entity> {\n const entity = await this.getById(id, opts);\n const em = this.repo.getEntityManager();\n if (this.useSoftDelete) {\n // For soft delete, set the deletedAt field\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: new Date() } as any);\n await em.flush();\n } else {\n await em.remove(entity).flush();\n }\n return entity;\n }\n\n /**\n * Delete multiple records with a `@ptc-org/nestjs-query-core` `Filter`.\n *\n * @example\n *\n * ```ts\n * const { deletedCount } = this.service.deleteMany({\n * created: { lte: new Date('2020-1-1') }\n * });\n * ```\n *\n * @param filter - A `Filter` to find records to delete.\n */\n async deleteMany(filter: Filter<Entity>): Promise<DeleteManyResponse> {\n const entities = await this.query({ filter });\n const em = this.repo.getEntityManager();\n\n if (this.useSoftDelete) {\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: new Date() } as any);\n }\n } else {\n for (const entity of entities) {\n em.remove(entity);\n }\n }\n\n await em.flush();\n return { deletedCount: entities.length };\n }\n\n /**\n * Restore an entity by `id`.\n *\n * @example\n *\n * ```ts\n * const restoredTodo = await this.service.restoreOne(1);\n * ```\n *\n * @param id - The `id` of the entity to restore.\n * @param opts Additional filter to use when finding the entity to restore.\n */\n async restoreOne(id: string | number, opts?: Filterable<Entity>): Promise<Entity> {\n this.ensureSoftDeleteEnabled();\n // When restoring, we need to find soft-deleted entities, so bypass filters\n const em = this.repo.getEntityManager();\n const metadata = em.getMetadata().get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0] as keyof Entity;\n\n let whereClause: FilterQuery<Entity> = {\n [primaryKey]: id,\n } as FilterQuery<Entity>;\n if (opts?.filter) {\n // Merge the additional filter with the ID filter\n const whereBuilder = new WhereBuilder<Entity>();\n const additionalWhere = whereBuilder.build(opts.filter);\n whereClause = {\n $and: [whereClause, additionalWhere as FilterQuery<Entity>],\n } as FilterQuery<Entity>;\n }\n\n const entity = await em.findOne(this.EntityClass, whereClause, {\n filters: false,\n });\n if (!entity) {\n throw new NotFoundException(`Unable to find ${this.EntityClass.name} with id: ${id}`);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: null } as any);\n await em.flush();\n return entity;\n }\n\n /**\n * Restores multiple records with a `@ptc-org/nestjs-query-core` `Filter`.\n *\n * @example\n *\n * ```ts\n * const { updatedCount } = this.service.restoreMany({\n * created: { lte: new Date('2020-1-1') }\n * });\n * ```\n *\n * @param filter - A `Filter` to find records to restore.\n */\n async restoreMany(filter: Filter<Entity>): Promise<UpdateManyResponse> {\n this.ensureSoftDeleteEnabled();\n // When restoring, we need to find soft-deleted entities, so bypass filters\n const em = this.repo.getEntityManager();\n const whereBuilder = new WhereBuilder<Entity>();\n const whereClause = whereBuilder.build(filter);\n const entities = await em.find(this.EntityClass, whereClause as FilterQuery<Entity>, {\n filters: false,\n });\n\n for (const entity of entities) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(entity).assign({ deletedAt: null } as any);\n }\n\n await em.flush();\n return { updatedCount: entities.length };\n }\n\n private get em() {\n return this.repo.getEntityManager();\n }\n\n private async ensureIsEntityAndDoesNotExist(e: DeepPartial<Entity>): Promise<Entity> {\n if (!(e instanceof this.EntityClass)) {\n const entity = this.em.create(\n this.repo.getEntityName() as unknown as EntityName<any>,\n e as RequiredEntityData<Entity>,\n );\n return this.ensureEntityDoesNotExist(entity as Entity);\n }\n return this.ensureEntityDoesNotExist(e);\n }\n\n private async ensureEntityDoesNotExist(e: Entity): Promise<Entity> {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0];\n const id = (e as Record<string, unknown>)[primaryKey];\n\n if (id) {\n // Clear the EM to avoid finding stale cached entities after truncate\n this.em.clear();\n const found = await this.repo.findOne({\n [primaryKey]: id,\n } as FilterQuery<Entity>);\n if (found) {\n throw new Error('Entity already exists');\n }\n }\n return e;\n }\n\n private ensureIdIsNotPresent(e: DeepPartial<Entity>): void {\n const metadata = this.em\n .getMetadata()\n .get(this.repo.getEntityName() as unknown as EntityName<any>);\n const primaryKey = metadata.primaryKeys[0];\n\n if ((e as Record<string, unknown>)[primaryKey]) {\n throw new Error('Id cannot be specified when updating');\n }\n }\n\n private ensureSoftDeleteEnabled(): void {\n if (!this.useSoftDelete) {\n throw new MethodNotAllowedException(\n `Restore not allowed for non soft deleted entity ${this.EntityClass.name}.`,\n );\n }\n }\n}\n","import type { AnyEntity, EntityName, EntityRepository } from '@mikro-orm/core';\nimport type { FactoryProvider } from '@nestjs/common';\nimport { getRepositoryToken } from '@mikro-orm/nestjs';\nimport { getQueryServiceToken } from '@ptc-org/nestjs-query-core';\n\nimport { MikroOrmQueryService } from './services';\n\nfunction createMikroOrmQueryServiceProvider<Entity extends object>(\n EntityClass: EntityName<Entity>,\n contextName?: string,\n): FactoryProvider {\n return {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n provide: getQueryServiceToken(EntityClass as any),\n useFactory(repo: EntityRepository<Entity>) {\n return new MikroOrmQueryService(repo);\n },\n inject: [getRepositoryToken(EntityClass, contextName)],\n };\n}\n\nexport const createMikroOrmQueryServiceProviders = (\n entities: EntityName<AnyEntity>[],\n contextName?: string,\n): FactoryProvider[] =>\n entities.map((entity) => createMikroOrmQueryServiceProvider(entity, contextName));\n","import type { AnyEntity, EntityName } from '@mikro-orm/core';\nimport type { DynamicModule } from '@nestjs/common';\nimport { MikroOrmModule } from '@mikro-orm/nestjs';\n\nimport { createMikroOrmQueryServiceProviders } from './providers';\n\nexport class NestjsQueryMikroOrmModule {\n static forFeature(entities: EntityName<AnyEntity>[], contextName?: string): DynamicModule {\n const queryServiceProviders = createMikroOrmQueryServiceProviders(entities, contextName);\n const mikroOrmModule = MikroOrmModule.forFeature(entities, contextName);\n return {\n imports: [mikroOrmModule],\n module: NestjsQueryMikroOrmModule,\n providers: [...queryServiceProviders],\n exports: [...queryServiceProviders, mikroOrmModule],\n };\n }\n}\n"]}
|