Skip to content

Commit a06bbc1

Browse files
authored
refactor: rewrite filter system with native macOS controls (#503)
* refactor: rewrite filter system with native macOS controls and fix persistence bugs * fix: address code review issues in filter system * docs: update filtering and keyboard shortcuts for filter system refactor * docs: simplify filtering documentation
1 parent 278ca12 commit a06bbc1

34 files changed

+404
-1760
lines changed

Plugins/BigQueryDriverPlugin/BigQueryPluginDriver.swift

Lines changed: 0 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -633,50 +633,6 @@ internal final class BigQueryPluginDriver: PluginDatabaseDriver, @unchecked Send
633633
)
634634
}
635635

636-
func buildQuickSearchQuery(
637-
table: String,
638-
searchText: String,
639-
columns: [String],
640-
sortColumns: [(columnIndex: Int, ascending: Bool)],
641-
limit: Int,
642-
offset: Int
643-
) -> String? {
644-
let dataset: String = lock.withLock {
645-
let ds = _currentDataset ?? ""
646-
_columnCache["\(ds).\(table)"] = columns
647-
return ds
648-
}
649-
return BigQueryQueryBuilder.encodeSearchQuery(
650-
table: table, dataset: dataset,
651-
searchText: searchText, searchColumns: columns,
652-
sortColumns: sortColumns, limit: limit, offset: offset
653-
)
654-
}
655-
656-
func buildCombinedQuery(
657-
table: String,
658-
filters: [(column: String, op: String, value: String)],
659-
logicMode: String,
660-
searchText: String,
661-
searchColumns: [String],
662-
sortColumns: [(columnIndex: Int, ascending: Bool)],
663-
columns: [String],
664-
limit: Int,
665-
offset: Int
666-
) -> String? {
667-
let dataset: String = lock.withLock {
668-
let ds = _currentDataset ?? ""
669-
_columnCache["\(ds).\(table)"] = columns
670-
return ds
671-
}
672-
return BigQueryQueryBuilder.encodeCombinedQuery(
673-
table: table, dataset: dataset,
674-
filters: filters, logicMode: logicMode,
675-
searchText: searchText, searchColumns: searchColumns,
676-
sortColumns: sortColumns, limit: limit, offset: offset
677-
)
678-
}
679-
680636
// MARK: - Statement Generation
681637

682638
func generateStatements(

Plugins/DynamoDBDriverPlugin/DynamoDBPluginDriver.swift

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -542,43 +542,6 @@ internal final class DynamoDBPluginDriver: PluginDatabaseDriver, @unchecked Send
542542
)
543543
}
544544

545-
func buildQuickSearchQuery(
546-
table: String,
547-
searchText: String,
548-
columns: [String],
549-
sortColumns: [(columnIndex: Int, ascending: Bool)],
550-
limit: Int,
551-
offset: Int
552-
) -> String? {
553-
DynamoDBQueryBuilder().buildQuickSearchQuery(
554-
table: table, searchText: searchText,
555-
sortColumns: sortColumns, limit: limit, offset: offset
556-
)
557-
}
558-
559-
func buildCombinedQuery(
560-
table: String,
561-
filters: [(column: String, op: String, value: String)],
562-
logicMode: String,
563-
searchText: String,
564-
searchColumns: [String],
565-
sortColumns: [(columnIndex: Int, ascending: Bool)],
566-
columns: [String],
567-
limit: Int,
568-
offset: Int
569-
) -> String? {
570-
let (keySchema, attrTypes) = lock.withLock {
571-
let desc = _tableDescriptionCache[table]
572-
return (extractKeySchema(from: desc), extractAttributeTypes(from: desc))
573-
}
574-
return DynamoDBQueryBuilder().buildCombinedQuery(
575-
table: table, filters: filters, logicMode: logicMode,
576-
searchText: searchText, sortColumns: sortColumns,
577-
limit: limit, offset: offset, keySchema: keySchema,
578-
attributeTypes: attrTypes
579-
)
580-
}
581-
582545
// MARK: - Statement Generation
583546

584547
func generateStatements(

Plugins/DynamoDBDriverPlugin/DynamoDBQueryBuilder.swift

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -97,70 +97,6 @@ struct DynamoDBQueryBuilder {
9797
)
9898
}
9999

100-
func buildQuickSearchQuery(
101-
table: String,
102-
searchText: String,
103-
sortColumns: [(columnIndex: Int, ascending: Bool)],
104-
limit: Int,
105-
offset: Int
106-
) -> String {
107-
let searchFilter = DynamoDBFilterSpec(column: "*", op: "CONTAINS", value: searchText)
108-
return Self.encodeScanQuery(
109-
tableName: table, limit: limit, offset: offset,
110-
filters: [searchFilter], logicMode: "AND"
111-
)
112-
}
113-
114-
func buildCombinedQuery(
115-
table: String,
116-
filters: [(column: String, op: String, value: String)],
117-
logicMode: String,
118-
searchText: String,
119-
sortColumns: [(columnIndex: Int, ascending: Bool)],
120-
limit: Int,
121-
offset: Int,
122-
keySchema: [(name: String, keyType: String)],
123-
attributeTypes: [String: String] = [:]
124-
) -> String? {
125-
let searchFilter: DynamoDBFilterSpec? = searchText.isEmpty
126-
? nil
127-
: DynamoDBFilterSpec(column: "*", op: "CONTAINS", value: searchText)
128-
129-
var allFilters = filters.map { DynamoDBFilterSpec(column: $0.column, op: $0.op, value: $0.value) }
130-
if let sf = searchFilter {
131-
allFilters.append(sf)
132-
}
133-
134-
if allFilters.isEmpty {
135-
return Self.encodeScanQuery(tableName: table, limit: limit, offset: offset, filters: [], logicMode: "AND")
136-
}
137-
138-
let partitionKey = keySchema.first(where: { $0.keyType == "HASH" })
139-
if let pk = partitionKey,
140-
let pkIdx = allFilters.firstIndex(where: { $0.column == pk.name && $0.op == "=" })
141-
{
142-
let pkFilter = allFilters[pkIdx]
143-
let pkType = attributeTypes[pk.name] ?? "S"
144-
var remainingFilters = allFilters
145-
remainingFilters.remove(at: pkIdx)
146-
return Self.encodeQueryQuery(
147-
tableName: table,
148-
partitionKeyName: pk.name,
149-
partitionKeyValue: pkFilter.value,
150-
partitionKeyType: pkType,
151-
limit: limit,
152-
offset: offset,
153-
filters: remainingFilters,
154-
logicMode: logicMode
155-
)
156-
}
157-
158-
return Self.encodeScanQuery(
159-
tableName: table, limit: limit, offset: offset,
160-
filters: allFilters, logicMode: logicMode
161-
)
162-
}
163-
164100
// MARK: - Encoding
165101

166102
private static func encodeScanQuery(

Plugins/EtcdDriverPlugin/EtcdPluginDriver.swift

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -356,39 +356,6 @@ final class EtcdPluginDriver: PluginDatabaseDriver, @unchecked Sendable {
356356
)
357357
}
358358

359-
func buildQuickSearchQuery(
360-
table: String,
361-
searchText: String,
362-
columns: [String],
363-
sortColumns: [(columnIndex: Int, ascending: Bool)],
364-
limit: Int,
365-
offset: Int
366-
) -> String? {
367-
let prefix = resolvedPrefix(for: table)
368-
return EtcdQueryBuilder().buildQuickSearchQuery(
369-
prefix: prefix, searchText: searchText,
370-
sortColumns: sortColumns, limit: limit, offset: offset
371-
)
372-
}
373-
374-
func buildCombinedQuery(
375-
table: String,
376-
filters: [(column: String, op: String, value: String)],
377-
logicMode: String,
378-
searchText: String,
379-
searchColumns: [String],
380-
sortColumns: [(columnIndex: Int, ascending: Bool)],
381-
columns: [String],
382-
limit: Int,
383-
offset: Int
384-
) -> String? {
385-
let prefix = resolvedPrefix(for: table)
386-
return EtcdQueryBuilder().buildCombinedQuery(
387-
prefix: prefix, filters: filters, logicMode: logicMode,
388-
searchText: searchText, sortColumns: sortColumns, limit: limit, offset: offset
389-
)
390-
}
391-
392359
// MARK: - Statement Generation
393360

394361
func generateStatements(

Plugins/EtcdDriverPlugin/EtcdQueryBuilder.swift

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -65,44 +65,6 @@ struct EtcdQueryBuilder {
6565
)
6666
}
6767

68-
func buildQuickSearchQuery(
69-
prefix: String,
70-
searchText: String,
71-
sortColumns: [(columnIndex: Int, ascending: Bool)],
72-
limit: Int,
73-
offset: Int
74-
) -> String {
75-
let sortAsc = sortColumns.first?.ascending ?? true
76-
return Self.encodeRangeQuery(
77-
prefix: prefix, limit: limit, offset: offset,
78-
sortAscending: sortAsc, filterType: .contains, filterValue: searchText
79-
)
80-
}
81-
82-
func buildCombinedQuery(
83-
prefix: String,
84-
filters: [(column: String, op: String, value: String)],
85-
logicMode: String,
86-
searchText: String,
87-
sortColumns: [(columnIndex: Int, ascending: Bool)],
88-
limit: Int,
89-
offset: Int
90-
) -> String? {
91-
if hasUnsupportedFilters(filters) { return nil }
92-
let sortAsc = sortColumns.first?.ascending ?? true
93-
if !searchText.isEmpty {
94-
return Self.encodeRangeQuery(
95-
prefix: prefix, limit: limit, offset: offset,
96-
sortAscending: sortAsc, filterType: .contains, filterValue: searchText
97-
)
98-
}
99-
let (filterType, filterValue) = extractKeyFilter(from: filters)
100-
return Self.encodeRangeQuery(
101-
prefix: prefix, limit: limit, offset: offset,
102-
sortAscending: sortAsc, filterType: filterType, filterValue: filterValue
103-
)
104-
}
105-
10668
func buildCountQuery(prefix: String) -> String {
10769
Self.encodeCountQuery(prefix: prefix, filterType: .none, filterValue: "")
10870
}

Plugins/MSSQLDriverPlugin/MSSQLPlugin.swift

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,67 +1237,6 @@ final class MSSQLPluginDriver: PluginDatabaseDriver, @unchecked Sendable {
12371237
return query
12381238
}
12391239

1240-
func buildQuickSearchQuery(
1241-
table: String,
1242-
searchText: String,
1243-
columns: [String],
1244-
sortColumns: [(columnIndex: Int, ascending: Bool)],
1245-
limit: Int,
1246-
offset: Int
1247-
) -> String? {
1248-
let quotedTable = mssqlQuoteIdentifier(table)
1249-
var query = "SELECT * FROM \(quotedTable)"
1250-
let escapedSearch = mssqlEscapeForLike(searchText)
1251-
let conditions = columns.map { column -> String in
1252-
let quotedColumn = mssqlQuoteIdentifier(column)
1253-
return "CAST(\(quotedColumn) AS NVARCHAR(MAX)) LIKE '%\(escapedSearch)%' ESCAPE '\\'"
1254-
}
1255-
if !conditions.isEmpty {
1256-
query += " WHERE (" + conditions.joined(separator: " OR ") + ")"
1257-
}
1258-
let orderBy = mssqlBuildOrderByClause(sortColumns: sortColumns, columns: columns)
1259-
?? "ORDER BY (SELECT NULL)"
1260-
query += " \(orderBy) OFFSET \(offset) ROWS FETCH NEXT \(limit) ROWS ONLY"
1261-
return query
1262-
}
1263-
1264-
func buildCombinedQuery(
1265-
table: String,
1266-
filters: [(column: String, op: String, value: String)],
1267-
logicMode: String,
1268-
searchText: String,
1269-
searchColumns: [String],
1270-
sortColumns: [(columnIndex: Int, ascending: Bool)],
1271-
columns: [String],
1272-
limit: Int,
1273-
offset: Int
1274-
) -> String? {
1275-
let quotedTable = mssqlQuoteIdentifier(table)
1276-
var query = "SELECT * FROM \(quotedTable)"
1277-
let filterConditions = mssqlBuildWhereClause(filters: filters, logicMode: logicMode)
1278-
let escapedSearch = mssqlEscapeForLike(searchText)
1279-
let searchConditions = searchColumns.map { column -> String in
1280-
let quotedColumn = mssqlQuoteIdentifier(column)
1281-
return "CAST(\(quotedColumn) AS NVARCHAR(MAX)) LIKE '%\(escapedSearch)%' ESCAPE '\\'"
1282-
}
1283-
let searchClause = searchConditions.isEmpty
1284-
? "" : "(" + searchConditions.joined(separator: " OR ") + ")"
1285-
var whereParts: [String] = []
1286-
if !filterConditions.isEmpty {
1287-
whereParts.append("(\(filterConditions))")
1288-
}
1289-
if !searchClause.isEmpty {
1290-
whereParts.append(searchClause)
1291-
}
1292-
if !whereParts.isEmpty {
1293-
query += " WHERE " + whereParts.joined(separator: " AND ")
1294-
}
1295-
let orderBy = mssqlBuildOrderByClause(sortColumns: sortColumns, columns: columns)
1296-
?? "ORDER BY (SELECT NULL)"
1297-
query += " \(orderBy) OFFSET \(offset) ROWS FETCH NEXT \(limit) ROWS ONLY"
1298-
return query
1299-
}
1300-
13011240
// MARK: - Query Building Helpers
13021241

13031242
private func mssqlQuoteIdentifier(_ identifier: String) -> String {

Plugins/MongoDBDriverPlugin/MongoDBPluginDriver.swift

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -567,40 +567,6 @@ final class MongoDBPluginDriver: PluginDatabaseDriver {
567567
)
568568
}
569569

570-
func buildQuickSearchQuery(
571-
table: String,
572-
searchText: String,
573-
columns: [String],
574-
sortColumns: [(columnIndex: Int, ascending: Bool)],
575-
limit: Int,
576-
offset: Int
577-
) -> String? {
578-
let builder = MongoDBQueryBuilder()
579-
return builder.buildQuickSearchQuery(
580-
collection: table, searchText: searchText, columns: columns,
581-
sortColumns: sortColumns, limit: limit, offset: offset
582-
)
583-
}
584-
585-
func buildCombinedQuery(
586-
table: String,
587-
filters: [(column: String, op: String, value: String)],
588-
logicMode: String,
589-
searchText: String,
590-
searchColumns: [String],
591-
sortColumns: [(columnIndex: Int, ascending: Bool)],
592-
columns: [String],
593-
limit: Int,
594-
offset: Int
595-
) -> String? {
596-
let builder = MongoDBQueryBuilder()
597-
return builder.buildCombinedQuery(
598-
collection: table, filters: filters, logicMode: logicMode,
599-
searchText: searchText, searchColumns: searchColumns,
600-
sortColumns: sortColumns, columns: columns, limit: limit, offset: offset
601-
)
602-
}
603-
604570
func generateStatements(
605571
table: String,
606572
columns: [String],

0 commit comments

Comments
 (0)