From 4aa69ce7f4aa56454587a61a50e723858975fc06 Mon Sep 17 00:00:00 2001 From: Ian Harrigan Date: Sat, 10 Aug 2024 12:15:54 +0200 Subject: [PATCH] use different limit / offset method when joins are being used --- src/db/utils/SqlUtils.hx | 39 ++++++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/src/db/utils/SqlUtils.hx b/src/db/utils/SqlUtils.hx index f5c3e93..9acdd80 100644 --- a/src/db/utils/SqlUtils.hx +++ b/src/db/utils/SqlUtils.hx @@ -55,11 +55,40 @@ class SqlUtils { if (query != null) { sql += '\nWHERE (${Query.queryExprToSql(query, values, table.name)})'; } - if (limit != null) { - sql += ' LIMIT ' + limit; - } - if (offset != null) { - sql += ' OFFSET ' + offset; + + var hasJoins = (relationships != null); + if (hasJoins) { + var tableDef = databaseSchema.findTable(table.name); + if (tableDef != null) { + var primaryKeyColumns = tableDef.findPrimaryKeyColumns(); + if (primaryKeyColumns != null && primaryKeyColumns.length > 0) { + if (limit != null || offset != null) { + if (query == null) { + sql += '\nWHERE '; + } else { + sql += ' AND\n'; + } + var tableName = table.name; + var primaryKeyName = primaryKeyColumns[0].name; + sql += '$tableName.$primaryKeyName IN (\n'; + sql += ' SELECT $primaryKeyName from $tableName\n'; + if (limit != null) { + sql += ' LIMIT $limit\n'; + } + if (offset != null) { + sql += ' OFFSET $offset\n'; + } + sql += ')'; + } + } + } + } else { + if (limit != null) { + sql += ' LIMIT ' + limit; + } + if (offset != null) { + sql += ' OFFSET ' + offset; + } } sql += ';'; return sql;