@@ -15,17 +15,20 @@ struct TableQueryBuilder {
1515
1616 private let databaseType : DatabaseType
1717 private var pluginDriver : ( any PluginDatabaseDriver ) ?
18+ private let dialect : SQLDialectDescriptor ?
1819 private let dialectQuote : ( String ) -> String
1920
2021 // MARK: - Initialization
2122
2223 init (
2324 databaseType: DatabaseType ,
2425 pluginDriver: ( any PluginDatabaseDriver ) ? = nil ,
26+ dialect: SQLDialectDescriptor ? = nil ,
2527 dialectQuote: ( ( String ) -> String ) ? = nil
2628 ) {
2729 self . databaseType = databaseType
2830 self . pluginDriver = pluginDriver
31+ self . dialect = dialect
2932 self . dialectQuote = dialectQuote ?? { name in
3033 let escaped = name. replacingOccurrences ( of: " \" " , with: " \" \" " )
3134 return " \" \( escaped) \" "
@@ -69,7 +72,7 @@ struct TableQueryBuilder {
6972 query += " \( orderBy) "
7073 }
7174
72- query += " LIMIT \( limit) OFFSET \( offset) "
75+ query += " \( buildPaginationClause ( limit: limit , offset: offset ) ) "
7376 return query
7477 }
7578
@@ -97,7 +100,23 @@ struct TableQueryBuilder {
97100 }
98101
99102 let quotedTable = quote ( tableName)
100- return " SELECT * FROM \( quotedTable) LIMIT \( limit) OFFSET \( offset) "
103+ var query = " SELECT * FROM \( quotedTable) "
104+
105+ if let dialect {
106+ let activeFilters = filters. filter { $0. isEnabled }
107+ let filterGen = FilterSQLGenerator ( dialect: dialect, quoteIdentifier: dialectQuote)
108+ let whereClause = filterGen. generateWhereClause ( from: activeFilters, logicMode: logicMode)
109+ if !whereClause. isEmpty {
110+ query += " \( whereClause) "
111+ }
112+ }
113+
114+ if let orderBy = buildOrderByClause ( sortState: sortState, columns: columns) {
115+ query += " \( orderBy) "
116+ }
117+
118+ query += " \( buildPaginationClause ( limit: limit, offset: offset) ) "
119+ return query
101120 }
102121
103122 func buildQuickSearchQuery(
@@ -119,7 +138,22 @@ struct TableQueryBuilder {
119138 }
120139
121140 let quotedTable = quote ( tableName)
122- return " SELECT * FROM \( quotedTable) LIMIT \( limit) OFFSET \( offset) "
141+ var query = " SELECT * FROM \( quotedTable) "
142+
143+ if let dialect {
144+ let filterGen = FilterSQLGenerator ( dialect: dialect, quoteIdentifier: dialectQuote)
145+ let searchWhere = filterGen. generateQuickSearchWhereClause ( searchText: searchText, columns: columns)
146+ if !searchWhere. isEmpty {
147+ query += " \( searchWhere) "
148+ }
149+ }
150+
151+ if let orderBy = buildOrderByClause ( sortState: sortState, columns: columns) {
152+ query += " \( orderBy) "
153+ }
154+
155+ query += " \( buildPaginationClause ( limit: limit, offset: offset) ) "
156+ return query
123157 }
124158
125159 func buildCombinedQuery(
@@ -149,7 +183,34 @@ struct TableQueryBuilder {
149183 }
150184
151185 let quotedTable = quote ( tableName)
152- return " SELECT * FROM \( quotedTable) LIMIT \( limit) OFFSET \( offset) "
186+ var query = " SELECT * FROM \( quotedTable) "
187+
188+ if let dialect {
189+ let activeFilters = filters. filter { $0. isEnabled }
190+ let filterGen = FilterSQLGenerator ( dialect: dialect, quoteIdentifier: dialectQuote)
191+ var whereParts : [ String ] = [ ]
192+
193+ let filterConditions = filterGen. generateConditions ( from: activeFilters, logicMode: logicMode)
194+ if !filterConditions. isEmpty {
195+ whereParts. append ( " ( \( filterConditions) ) " )
196+ }
197+
198+ let searchConditions = filterGen. generateQuickSearchConditions ( searchText: searchText, columns: searchColumns)
199+ if !searchConditions. isEmpty {
200+ whereParts. append ( " ( \( searchConditions) ) " )
201+ }
202+
203+ if !whereParts. isEmpty {
204+ query += " WHERE \( whereParts. joined ( separator: " AND " ) ) "
205+ }
206+ }
207+
208+ if let orderBy = buildOrderByClause ( sortState: sortState, columns: columns) {
209+ query += " \( orderBy) "
210+ }
211+
212+ query += " \( buildPaginationClause ( limit: limit, offset: offset) ) "
213+ return query
153214 }
154215
155216 func buildSortedQuery(
@@ -213,6 +274,13 @@ struct TableQueryBuilder {
213274
214275 // MARK: - Private Helpers
215276
277+ private func buildPaginationClause( limit: Int , offset: Int ) -> String {
278+ if let dialect, dialect. paginationStyle == . offsetFetch {
279+ return " OFFSET \( offset) ROWS FETCH NEXT \( limit) ROWS ONLY "
280+ }
281+ return " LIMIT \( limit) OFFSET \( offset) "
282+ }
283+
216284 private func sortColumnsAsTuples( _ sortState: SortState ? ) -> [ ( columnIndex: Int , ascending: Bool ) ] {
217285 sortState? . columns. compactMap { sortCol -> ( columnIndex: Int , ascending: Bool ) ? in
218286 guard sortCol. columnIndex >= 0 else { return nil }
0 commit comments