Browse Source

[HyperExpress] Refactor(postgres.js): Using bulk updates for database updates (#8348)

Imam Fahrur Rofi 2 years ago
parent
commit
30cfe14884

+ 1 - 2
frameworks/JavaScript/hyperexpress/app.js

@@ -76,10 +76,9 @@ if (db) {
 
 
       for (let i = 0; i < queries; i++) {
       for (let i = 0; i < queries; i++) {
         worlds[i].randomNumber = generateRandomNumber()
         worlds[i].randomNumber = generateRandomNumber()
-        worldPromises[i] = db.update(worlds[i])
       }
       }
 
 
-      await Promise.all(worldPromises)
+      await db.bulkUpdate(worlds)
 
 
       response.json(worlds)
       response.json(worlds)
     } catch (error) {
     } catch (error) {

+ 2 - 0
frameworks/JavaScript/hyperexpress/database/mysql.js

@@ -13,3 +13,5 @@ export const find = (id) => execute('SELECT id, randomNumber FROM world WHERE id
 export const getAllWorlds = () => execute('SELECT id, randomNumber FROM world')
 export const getAllWorlds = () => execute('SELECT id, randomNumber FROM world')
 
 
 export const update = (obj) => execute('UPDATE world SET randomNumber = ? WHERE id = ?', [obj.randomNumber, obj.id])
 export const update = (obj) => execute('UPDATE world SET randomNumber = ? WHERE id = ?', [obj.randomNumber, obj.id])
+
+export const bulkUpdate = (worlds) => Promise.all(worlds.map(world => update(world)))

+ 3 - 1
frameworks/JavaScript/hyperexpress/database/postgres.js

@@ -9,4 +9,6 @@ export const find = async (id) => sql`SELECT id, randomNumber FROM world WHERE i
 
 
 export const getAllWorlds = async () => sql`SELECT id, randomNumber FROM world`
 export const getAllWorlds = async () => sql`SELECT id, randomNumber FROM world`
 
 
-export const update = async (obj) => sql`UPDATE world SET randomNumber = ${obj.randomNumber} WHERE id = ${obj.id}`
+export const bulkUpdate = async (worlds) => await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int
+  FROM (VALUES ${sql(worlds.map(world => [world.id, world.randomNumber]).sort((a, b) => (a[0] < b[0]) ? -1 : 1))}) AS update_data (id, randomNumber)
+  WHERE world.id = (update_data.id)::int`;