fix: performant relations

This commit is contained in:
Sebastian Rindom
2021-02-18 10:31:09 +01:00
parent c2a075a6b1
commit 5659d106e3
5 changed files with 914 additions and 31 deletions
+16 -19
View File
@@ -10,28 +10,22 @@ export class OrderRepository extends Repository<Order> {
): Promise<Order[]> {
const entities = await this.find(optionsWithoutRelations)
const entitiesIds = entities.map(({ id }) => id)
const groupedRelations = {}
for (const rel of relations) {
const [topLevel] = rel.split(".")
if (groupedRelations[topLevel]) {
groupedRelations[topLevel].push(rel)
} else {
groupedRelations[topLevel] = [rel]
}
}
const entitiesIdsWithRelations = await Promise.all(
relations.map(relation => {
const relationParts = relation.split(".") as string[]
const partialRelations = relationParts.reduce(
(acc: string[], _: string, index: number) => {
const toPush = []
for (let i = 0; i <= index; i++) {
toPush.push(relationParts[i])
}
acc.push(toPush.join("."))
return acc
},
[] as string[]
)
Object.entries(groupedRelations).map(([_, rels]) => {
return this.findByIds(entitiesIds, {
select: ["id"],
relations: partialRelations,
relations: rels as string[],
})
})
).then(flatten)
@@ -47,6 +41,9 @@ export class OrderRepository extends Repository<Order> {
relations: Array<keyof Order> = [],
optionsWithoutRelations: Omit<FindManyOptions<Order>, "relations"> = {}
): Promise<Order> {
// Limit 1
optionsWithoutRelations.take = 1
const result = await this.findWithRelations(
relations,
optionsWithoutRelations
+3 -1
View File
@@ -328,7 +328,9 @@ class OrderService extends BaseService {
query.select = select
}
const raw = await orderRepo.findOneWithRelations(query.relations, query)
const rels = query.relations
delete query.relations
const raw = await orderRepo.findOneWithRelations(rels, query)
if (!raw) {
throw new MedusaError(
File diff suppressed because it is too large Load Diff