Skip to content

Commit 7d75838

Browse files
committed
chore: use createMany for instrument records to improve performance #1054
1 parent 71d777f commit 7d75838

File tree

1 file changed

+42
-58
lines changed

1 file changed

+42
-58
lines changed

apps/api/src/instrument-records/instrument-records.service.ts

Lines changed: 42 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -274,80 +274,64 @@ export class InstrumentRecordsService {
274274
);
275275
}
276276

277-
const createdRecordsArray: InstrumentRecordModel[] = [];
278277
const createdSessionsArray: SessionModel[] = [];
279278

280279
try {
281-
for (let i = 0; i < records.length; i++) {
282-
const { data: rawData, date, subjectId } = records[i]!;
283-
await this.createSubjectIfNotFound(subjectId);
284-
285-
const session = await this.sessionsService.create({
286-
date: date,
287-
groupId: groupId ? groupId : null,
288-
subjectData: {
289-
id: subjectId
290-
},
291-
type: 'RETROSPECTIVE'
292-
});
280+
const preProcessedRecords = await Promise.all(
281+
records.map(async (record) => {
282+
const { data: rawData, date, subjectId } = record;
283+
284+
// Validate data
285+
const parseResult = instrument.validationSchema.safeParse(this.parseJson(rawData));
286+
if (!parseResult.success) {
287+
console.error(parseResult.error.issues);
288+
throw new UnprocessableEntityException(
289+
`Data received for record does not pass validation schema of instrument '${instrument.id}'`
290+
);
291+
}
293292

294-
createdSessionsArray.push(session);
293+
// Ensure subject exists
294+
await this.createSubjectIfNotFound(subjectId);
295295

296-
const sessionId = session.id;
296+
const session = await this.sessionsService.create({
297+
date: date,
298+
groupId: groupId ?? null,
299+
subjectData: { id: subjectId },
300+
type: 'RETROSPECTIVE'
301+
});
297302

298-
const parseResult = instrument.validationSchema.safeParse(this.parseJson(rawData));
299-
if (!parseResult.success) {
300-
console.error(parseResult.error.issues);
301-
throw new UnprocessableEntityException(
302-
`Data received for record at index '${i}' does not pass validation schema of instrument '${instrument.id}'`
303-
);
304-
}
303+
createdSessionsArray.push(session);
305304

306-
const createdRecord = await this.instrumentRecordModel.create({
307-
data: {
308-
computedMeasures: instrument.measures
309-
? this.instrumentMeasuresService.computeMeasures(instrument.measures, parseResult.data)
310-
: null,
305+
const computedMeasures = instrument.measures
306+
? this.instrumentMeasuresService.computeMeasures(instrument.measures, parseResult.data)
307+
: null;
308+
309+
return {
310+
computedMeasures,
311311
data: this.serializeData(parseResult.data),
312312
date,
313-
group: groupId
314-
? {
315-
connect: { id: groupId }
316-
}
317-
: undefined,
318-
instrument: {
319-
connect: {
320-
id: instrumentId
321-
}
322-
},
323-
session: {
324-
connect: {
325-
id: sessionId
326-
}
327-
},
328-
subject: {
329-
connect: {
330-
id: subjectId
331-
}
332-
}
333-
}
334-
});
313+
groupId,
314+
instrumentId,
315+
sessionId: session.id,
316+
subjectId
317+
};
318+
})
319+
);
335320

336-
createdRecordsArray.push(createdRecord);
337-
}
338-
} catch (err) {
339-
await this.instrumentRecordModel.deleteMany({
321+
await this.instrumentRecordModel.createMany({
322+
data: preProcessedRecords
323+
});
324+
325+
return this.instrumentRecordModel.findMany({
340326
where: {
341-
id: {
342-
in: createdRecordsArray.map((record) => record.id)
343-
}
327+
groupId,
328+
instrumentId
344329
}
345330
});
331+
} catch (err) {
346332
await this.sessionsService.deleteByIds(createdSessionsArray.map((session) => session.id));
347333
throw err;
348334
}
349-
350-
return createdRecordsArray;
351335
}
352336

353337
private async createSubjectIfNotFound(subjectId: string) {

0 commit comments

Comments
 (0)