From 84a5707d6d2ea14cf93c43e50b741a76600704ba Mon Sep 17 00:00:00 2001
From: Jonathan Waltz <volcanicislander@gmail.com>
Date: Tue, 13 Jun 2023 11:07:58 -1000
Subject: [PATCH] refactor: convert insert loop to 1 insert stmt (#19)

* fix: convert insert loop to 1 insert stmt

* chore: lint
---
 server/models/vectors.js | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/server/models/vectors.js b/server/models/vectors.js
index aad671f51..776179d02 100644
--- a/server/models/vectors.js
+++ b/server/models/vectors.js
@@ -31,17 +31,26 @@ const DocumentVectors = {
   },
   bulkInsert: async function (vectorRecords = []) {
     if (vectorRecords.length === 0) return;
-    const db = await this.db();
-    const stmt = await db.prepare(
-      `INSERT INTO ${this.tablename} (docId, vectorId) VALUES (?, ?)`
-    );
-    for (const record of vectorRecords) {
-      const { docId, vectorId } = record;
-      stmt.run([docId, vectorId]);
-    }
 
+    const db = await this.db();
+
+    // Build a single query string with multiple placeholders for the INSERT operation
+    const placeholders = vectorRecords.map(() => "(?, ?)").join(", ");
+
+    const stmt = await db.prepare(
+      `INSERT INTO ${this.tablename} (docId, vectorId) VALUES ${placeholders}`
+    );
+
+    // Flatten the vectorRecords array to match the order of placeholders
+    const values = vectorRecords.reduce(
+      (arr, record) => arr.concat([record.docId, record.vectorId]),
+      []
+    );
+
+    stmt.run(values);
     stmt.finalize();
     db.close();
+
     return { documentsInserted: vectorRecords.length };
   },
   deleteForWorkspace: async function (workspaceId) {