@@ -11,7 +11,7 @@ import { db } from '@sim/db'
1111import { userTableDefinitions , userTableRows } from '@sim/db/schema'
1212import { createLogger } from '@sim/logger'
1313import { and , count , eq , sql } from 'drizzle-orm'
14- import { TABLE_LIMITS } from './constants'
14+ import { TABLE_LIMITS , USER_TABLE_ROWS_SQL_NAME } from './constants'
1515import { buildFilterClause , buildSortClause } from './sql'
1616import type {
1717 BatchInsertData ,
@@ -29,12 +29,13 @@ import type {
2929 UpdateRowData ,
3030} from './types'
3131import {
32+ checkBatchUniqueConstraintsDb ,
33+ checkUniqueConstraintsDb ,
3234 getUniqueColumns ,
3335 validateRowAgainstSchema ,
3436 validateRowSize ,
3537 validateTableName ,
3638 validateTableSchema ,
37- validateUniqueConstraints ,
3839} from './validation'
3940
4041const logger = createLogger ( 'TableService' )
@@ -227,19 +228,10 @@ export async function insertRow(
227228 throw new Error ( `Schema validation failed: ${ schemaValidation . errors . join ( ', ' ) } ` )
228229 }
229230
230- // Check unique constraints
231+ // Check unique constraints using optimized database query
231232 const uniqueColumns = getUniqueColumns ( table . schema )
232233 if ( uniqueColumns . length > 0 ) {
233- const existingRows = await db
234- . select ( { id : userTableRows . id , data : userTableRows . data } )
235- . from ( userTableRows )
236- . where ( eq ( userTableRows . tableId , data . tableId ) )
237-
238- const uniqueValidation = validateUniqueConstraints (
239- data . data ,
240- table . schema ,
241- existingRows . map ( ( r ) => ( { id : r . id , data : r . data as RowData } ) )
242- )
234+ const uniqueValidation = await checkUniqueConstraintsDb ( data . tableId , data . data , table . schema )
243235 if ( ! uniqueValidation . valid ) {
244236 throw new Error ( uniqueValidation . errors . join ( ', ' ) )
245237 }
@@ -306,23 +298,16 @@ export async function batchInsertRows(
306298 }
307299 }
308300
309- // Check unique constraints across all rows
301+ // Check unique constraints across all rows using optimized database query
310302 const uniqueColumns = getUniqueColumns ( table . schema )
311303 if ( uniqueColumns . length > 0 ) {
312- const existingRows = await db
313- . select ( { id : userTableRows . id , data : userTableRows . data } )
314- . from ( userTableRows )
315- . where ( eq ( userTableRows . tableId , data . tableId ) )
316-
317- const allRows = existingRows . map ( ( r ) => ( { id : r . id , data : r . data as RowData } ) )
318-
319- for ( let i = 0 ; i < data . rows . length ; i ++ ) {
320- const uniqueValidation = validateUniqueConstraints ( data . rows [ i ] , table . schema , allRows )
321- if ( ! uniqueValidation . valid ) {
322- throw new Error ( `Row ${ i + 1 } : ${ uniqueValidation . errors . join ( ', ' ) } ` )
323- }
324- // Add to allRows for checking subsequent rows in batch
325- allRows . push ( { id : `pending_${ i } ` , data : data . rows [ i ] } )
304+ const uniqueResult = await checkBatchUniqueConstraintsDb ( data . tableId , data . rows , table . schema )
305+ if ( ! uniqueResult . valid ) {
306+ // Format errors for batch insert
307+ const errorMessages = uniqueResult . errors
308+ . map ( ( e ) => `Row ${ e . row + 1 } : ${ e . errors . join ( ', ' ) } ` )
309+ . join ( '; ' )
310+ throw new Error ( errorMessages )
326311 }
327312 }
328313
@@ -365,7 +350,7 @@ export async function queryRows(
365350) : Promise < QueryResult > {
366351 const { filter, sort, limit = TABLE_LIMITS . DEFAULT_QUERY_LIMIT , offset = 0 } = options
367352
368- const tableName = 'user_table_rows'
353+ const tableName = USER_TABLE_ROWS_SQL_NAME
369354
370355 // Build WHERE clause
371356 const baseConditions = and (
@@ -493,18 +478,13 @@ export async function updateRow(
493478 throw new Error ( `Schema validation failed: ${ schemaValidation . errors . join ( ', ' ) } ` )
494479 }
495480
496- // Check unique constraints
481+ // Check unique constraints using optimized database query
497482 const uniqueColumns = getUniqueColumns ( table . schema )
498483 if ( uniqueColumns . length > 0 ) {
499- const existingRows = await db
500- . select ( { id : userTableRows . id , data : userTableRows . data } )
501- . from ( userTableRows )
502- . where ( eq ( userTableRows . tableId , data . tableId ) )
503-
504- const uniqueValidation = validateUniqueConstraints (
484+ const uniqueValidation = await checkUniqueConstraintsDb (
485+ data . tableId ,
505486 data . data ,
506487 table . schema ,
507- existingRows . map ( ( r ) => ( { id : r . id , data : r . data as RowData } ) ) ,
508488 data . rowId // Exclude current row
509489 )
510490 if ( ! uniqueValidation . valid ) {
@@ -567,7 +547,7 @@ export async function updateRowsByFilter(
567547 table : TableDefinition ,
568548 requestId : string
569549) : Promise < BulkOperationResult > {
570- const tableName = 'user_table_rows'
550+ const tableName = USER_TABLE_ROWS_SQL_NAME
571551
572552 // Build filter clause
573553 const filterClause = buildFilterClause ( data . filter , tableName )
@@ -651,7 +631,7 @@ export async function deleteRowsByFilter(
651631 data : BulkDeleteData ,
652632 requestId : string
653633) : Promise < BulkOperationResult > {
654- const tableName = 'user_table_rows'
634+ const tableName = USER_TABLE_ROWS_SQL_NAME
655635
656636 // Build filter clause
657637 const filterClause = buildFilterClause ( data . filter , tableName )
0 commit comments