@@ -1125,6 +1125,7 @@ final class MainContentCoordinator {
11251125 let tabId = tab. id
11261126 let resultVersion = tab. resultVersion
11271127 let sortColumns = currentSort. columns
1128+ let colTypes = tab. columnTypes
11281129
11291130 if rows. count > 10_000 {
11301131 // Large dataset: sort on background thread to avoid UI freeze
@@ -1136,7 +1137,11 @@ final class MainContentCoordinator {
11361137
11371138 let sortStartTime = Date ( )
11381139 let task = Task . detached { [ weak self] in
1139- let sortedIndices = Self . multiColumnSortIndices ( rows: rows, sortColumns: sortColumns)
1140+ let sortedIndices = Self . multiColumnSortIndices (
1141+ rows: rows,
1142+ sortColumns: sortColumns,
1143+ columnTypes: colTypes
1144+ )
11401145 let sortDuration = Date ( ) . timeIntervalSince ( sortStartTime)
11411146
11421147 await MainActor . run { [ weak self] in
@@ -1194,37 +1199,35 @@ final class MainContentCoordinator {
11941199 /// Returns an array of indices into the original `rows` array, sorted by the given columns.
11951200 nonisolated private static func multiColumnSortIndices(
11961201 rows: [ [ String ? ] ] ,
1197- sortColumns: [ SortColumn ]
1202+ sortColumns: [ SortColumn ] ,
1203+ columnTypes: [ ColumnType ] = [ ]
11981204 ) -> [ Int ] {
11991205 // Fast path: single-column sort avoids intermediate key array allocation
12001206 if sortColumns. count == 1 {
12011207 let col = sortColumns [ 0 ]
12021208 let colIndex = col. columnIndex
12031209 let ascending = col. direction == . ascending
1210+ let colType = colIndex < columnTypes. count ? columnTypes [ colIndex] : nil
12041211 var indices = Array ( 0 ..< rows. count)
12051212 indices. sort { i1, i2 in
12061213 let v1 = colIndex < rows [ i1] . count ? ( rows [ i1] [ colIndex] ?? " " ) : " "
12071214 let v2 = colIndex < rows [ i2] . count ? ( rows [ i2] [ colIndex] ?? " " ) : " "
1208- let cmp = v1 . localizedStandardCompare ( v2 )
1215+ let cmp = RowSortComparator . compare ( v1 , v2 , columnType : colType )
12091216 return ascending ? cmp == . orderedAscending : cmp == . orderedDescending
12101217 }
12111218 return indices
12121219 }
12131220
1214- // Pre-extract sort keys for each row to avoid repeated access during comparison
1215- let sortKeys : [ [ String ] ] = rows. map { row in
1216- sortColumns. map { sortCol in
1217- sortCol. columnIndex < row. count
1218- ? ( row [ sortCol. columnIndex] ?? " " ) : " "
1219- }
1220- }
1221-
12221221 var indices = Array ( 0 ..< rows. count)
12231222 indices. sort { i1, i2 in
1224- let keys1 = sortKeys [ i1]
1225- let keys2 = sortKeys [ i2]
1226- for (colIdx, sortCol) in sortColumns. enumerated ( ) {
1227- let result = keys1 [ colIdx] . localizedStandardCompare ( keys2 [ colIdx] )
1223+ let row1 = rows [ i1]
1224+ let row2 = rows [ i2]
1225+ for sortCol in sortColumns {
1226+ let v1 = sortCol. columnIndex < row1. count ? ( row1 [ sortCol. columnIndex] ?? " " ) : " "
1227+ let v2 = sortCol. columnIndex < row2. count ? ( row2 [ sortCol. columnIndex] ?? " " ) : " "
1228+ let colType = sortCol. columnIndex < columnTypes. count
1229+ ? columnTypes [ sortCol. columnIndex] : nil
1230+ let result = RowSortComparator . compare ( v1, v2, columnType: colType)
12281231 if result == . orderedSame { continue }
12291232 return sortCol. direction == . ascending
12301233 ? result == . orderedAscending
0 commit comments