From ef2cc110419f597232ef4075938aff42f04ef5f5 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Thu, 25 Nov 2021 20:35:17 +0300 Subject: [PATCH] refactor: optimized query --- app/Services/LessonService.ts | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/app/Services/LessonService.ts b/app/Services/LessonService.ts index 2e226e7..7a39a07 100644 --- a/app/Services/LessonService.ts +++ b/app/Services/LessonService.ts @@ -1,12 +1,12 @@ import { inject, Ioc } from '@adonisjs/core/build/standalone'; import { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; +import Database from '@ioc:Adonis/Lucid/Database'; /** * Datatypes */ import HttpStatusEnum from 'App/Datatypes/Enums/HttpStatusEnum'; import IResponse from 'App/Datatypes/Interfaces/IResponse'; -import Lesson from 'App/Models/Lesson'; import LessonMaterial from 'App/Models/LessonMaterial'; /** @@ -271,14 +271,18 @@ export default class LessonService { /** * Update order of lessons */ - // TODO can be transformed into one query - await Promise.all( - ids.map(async (id, i) => { - await Lesson.query() - .where('id', id) - .update({ display_order: i + 1 }); - }) - ); + const params = ids + .map((id, i) => ({ id, i: i + 1 })) + .reduce((result: Array, { id, i }) => result.concat(id, i), []); + + const query = ` + UPDATE lessons + SET display_order = t.display_order + FROM (VALUES ${ids.map(() => `(?, ??)`).join(',')}) as t(id, display_order) + WHERE t.id = lessons.id + `; + + await Database.rawQuery(query, params); return { success: true,