@@ -18,6 +18,14 @@ private struct SortedRowsCache {
1818 let resultVersion : Int
1919}
2020
21+ /// Per-tab row provider cache entry — groups all cache-invalidation keys together
22+ private struct RowProviderCacheEntry {
23+ let provider : InMemoryRowProvider
24+ let resultVersion : Int
25+ let metadataVersion : Int
26+ let sortState : SortState
27+ }
28+
2129/// Main editor content with tab bar and content switching
2230struct MainEditorContentView : View {
2331 // MARK: - Dependencies
@@ -62,10 +70,7 @@ struct MainEditorContentView: View {
6270 @State private var sortCache : [ UUID : SortedRowsCache ] = [ : ]
6371
6472 // Per-tab row provider cache — avoids recreation on every SwiftUI render.
65- @State private var tabRowProviders : [ UUID : InMemoryRowProvider ] = [ : ]
66- @State private var tabProviderVersions : [ UUID : Int ] = [ : ]
67- @State private var tabProviderMetaVersions : [ UUID : Int ] = [ : ]
68- @State private var tabProviderSortStates : [ UUID : SortState ] = [ : ]
73+ @State private var tabProviderCache : [ UUID : RowProviderCacheEntry ] = [ : ]
6974 @State private var cachedChangeManager : AnyChangeManager ?
7075 @State private var favoriteDialogQuery : FavoriteDialogQuery ?
7176
@@ -120,52 +125,32 @@ struct MainEditorContentView: View {
120125 let openTabIds = Set ( newIds)
121126 sortCache = sortCache. filter { openTabIds. contains ( $0. key) }
122127 coordinator. cleanupSortCache ( openTabIds: openTabIds)
123- tabRowProviders = tabRowProviders. filter { openTabIds. contains ( $0. key) }
124- tabProviderVersions = tabProviderVersions. filter { openTabIds. contains ( $0. key) }
125- tabProviderMetaVersions = tabProviderMetaVersions. filter { openTabIds. contains ( $0. key) }
126- tabProviderSortStates = tabProviderSortStates. filter { openTabIds. contains ( $0. key) }
128+ tabProviderCache = tabProviderCache. filter { openTabIds. contains ( $0. key) }
127129 }
128130 . onChange ( of: tabManager. selectedTabId) { _, newId in
129131 updateHasQueryText ( )
130132
131133 guard let newId, let tab = tabManager. selectedTab else { return }
132- if tabProviderVersions [ newId] != tab. resultVersion
133- || tabProviderMetaVersions [ newId] != tab. metadataVersion {
134- let provider = makeRowProvider ( for: tab)
135- tabRowProviders [ newId] = provider
136- tabProviderVersions [ newId] = tab. resultVersion
137- tabProviderMetaVersions [ newId] = tab. metadataVersion
138- tabProviderSortStates [ newId] = tab. sortState
134+ let cached = tabProviderCache [ newId]
135+ if cached? . resultVersion != tab. resultVersion
136+ || cached? . metadataVersion != tab. metadataVersion {
137+ cacheRowProvider ( for: tab)
139138 }
140139 }
141140 . onAppear {
142141 updateHasQueryText ( )
143142 cachedChangeManager = AnyChangeManager ( dataManager: changeManager)
144143 if let tab = tabManager. selectedTab {
145- let provider = makeRowProvider ( for: tab)
146- tabRowProviders [ tab. id] = provider
147- tabProviderVersions [ tab. id] = tab. resultVersion
148- tabProviderMetaVersions [ tab. id] = tab. metadataVersion
149- tabProviderSortStates [ tab. id] = tab. sortState
144+ cacheRowProvider ( for: tab)
150145 }
151146 }
152147 . onChange ( of: tabManager. selectedTab? . resultVersion) { _, newVersion in
153- guard let tab = tabManager. selectedTab, newVersion != nil else {
154- return
155- }
156- let provider = makeRowProvider ( for: tab)
157- tabRowProviders [ tab. id] = provider
158- tabProviderVersions [ tab. id] = tab. resultVersion
159- tabProviderMetaVersions [ tab. id] = tab. metadataVersion
160- tabProviderSortStates [ tab. id] = tab. sortState
148+ guard let tab = tabManager. selectedTab, newVersion != nil else { return }
149+ cacheRowProvider ( for: tab)
161150 }
162151 . onChange ( of: tabManager. selectedTab? . metadataVersion) { _, _ in
163152 guard let tab = tabManager. selectedTab else { return }
164- let provider = makeRowProvider ( for: tab)
165- tabRowProviders [ tab. id] = provider
166- tabProviderVersions [ tab. id] = tab. resultVersion
167- tabProviderMetaVersions [ tab. id] = tab. metadataVersion
168- tabProviderSortStates [ tab. id] = tab. sortState
153+ cacheRowProvider ( for: tab)
169154 }
170155 }
171156
@@ -354,16 +339,33 @@ struct MainEditorContentView: View {
354339
355340 private func rowProvider( for tab: QueryTab ) -> InMemoryRowProvider {
356341 if tab. rowBuffer. isEvicted {
357- tabRowProviders . removeValue ( forKey: tab. id)
342+ tabProviderCache . removeValue ( forKey: tab. id)
358343 return makeRowProvider ( for: tab)
359344 }
360- if let cached = tabRowProviders [ tab. id] ,
361- tabProviderVersions [ tab . id ] == tab. resultVersion,
362- tabProviderMetaVersions [ tab . id ] == tab. metadataVersion,
363- tabProviderSortStates [ tab . id ] == tab. sortState {
364- return cached
345+ if let entry = tabProviderCache [ tab. id] ,
346+ entry . resultVersion == tab. resultVersion,
347+ entry . metadataVersion == tab. metadataVersion,
348+ entry . sortState == tab. sortState {
349+ return entry . provider
365350 }
366- return makeRowProvider ( for: tab)
351+ let provider = makeRowProvider ( for: tab)
352+ tabProviderCache [ tab. id] = RowProviderCacheEntry (
353+ provider: provider,
354+ resultVersion: tab. resultVersion,
355+ metadataVersion: tab. metadataVersion,
356+ sortState: tab. sortState
357+ )
358+ return provider
359+ }
360+
361+ private func cacheRowProvider( for tab: QueryTab ) {
362+ let provider = makeRowProvider ( for: tab)
363+ tabProviderCache [ tab. id] = RowProviderCacheEntry (
364+ provider: provider,
365+ resultVersion: tab. resultVersion,
366+ metadataVersion: tab. metadataVersion,
367+ sortState: tab. sortState
368+ )
367369 }
368370
369371 private func makeRowProvider( for tab: QueryTab ) -> InMemoryRowProvider {
0 commit comments