@@ -18,14 +18,6 @@ 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-
2921/// Main editor content with tab bar and content switching
3022struct MainEditorContentView : View {
3123 // MARK: - Dependencies
@@ -69,8 +61,7 @@ struct MainEditorContentView: View {
6961
7062 @State private var sortCache : [ UUID : SortedRowsCache ] = [ : ]
7163
72- // Per-tab row provider cache — avoids recreation on every SwiftUI render.
73- @State private var tabProviderCache : [ UUID : RowProviderCacheEntry ] = [ : ]
64+ @State private var providerCache = RowProviderCache ( )
7465 @State private var cachedChangeManager : AnyChangeManager ?
7566 @State private var erDiagramViewModels : [ UUID : ERDiagramViewModel ] = [ : ]
7667 @State private var serverDashboardViewModels : [ UUID : ServerDashboardViewModel ] = [ : ]
@@ -127,26 +118,28 @@ struct MainEditorContentView: View {
127118 favoriteDialogQuery = FavoriteDialogQuery ( query: query)
128119 }
129120 . onChange ( of: tabManager. tabIds) { _, newIds in
130- guard !sortCache. isEmpty || !tabProviderCache . isEmpty || !erDiagramViewModels. isEmpty
121+ guard !sortCache. isEmpty || !providerCache . isEmpty || !erDiagramViewModels. isEmpty
131122 || !serverDashboardViewModels. isEmpty else {
132123 coordinator. cleanupSortCache ( openTabIds: Set ( newIds) )
133124 return
134125 }
135126 let openTabIds = Set ( newIds)
136127 sortCache = sortCache. filter { openTabIds. contains ( $0. key) }
137128 coordinator. cleanupSortCache ( openTabIds: openTabIds)
138- tabProviderCache = tabProviderCache . filter { openTabIds. contains ( $0 . key ) }
129+ providerCache . retain ( tabIds : openTabIds)
139130 erDiagramViewModels = erDiagramViewModels. filter { openTabIds. contains ( $0. key) }
140131 serverDashboardViewModels = serverDashboardViewModels. filter { openTabIds. contains ( $0. key) }
141132 }
142- . onChange ( of: tabManager. selectedTabId) { _, newId in
133+ . onChange ( of: tabManager. selectedTabId) { _, _ in
143134 updateHasQueryText ( )
144135
145- guard let newId, let tab = tabManager. selectedTab else { return }
146- let cached = tabProviderCache [ newId]
147- if cached? . resultVersion != tab. resultVersion
148- || cached? . metadataVersion != tab. metadataVersion
149- {
136+ guard let tab = tabManager. selectedTab else { return }
137+ if providerCache. provider (
138+ for: tab. id,
139+ resultVersion: tab. resultVersion,
140+ metadataVersion: tab. metadataVersion,
141+ sortState: tab. sortState
142+ ) == nil {
150143 cacheRowProvider ( for: tab)
151144 }
152145 }
@@ -157,7 +150,7 @@ struct MainEditorContentView: View {
157150 cacheRowProvider ( for: tab)
158151 }
159152 coordinator. onTeardown = { [ self ] in
160- tabProviderCache . removeAll ( )
153+ providerCache . removeAll ( )
161154 sortCache. removeAll ( )
162155 cachedChangeManager = nil
163156 }
@@ -570,32 +563,33 @@ struct MainEditorContentView: View {
570563
571564 private func rowProvider( for tab: QueryTab ) -> InMemoryRowProvider {
572565 if tab. rowBuffer. isEvicted {
573- Task { @ MainActor in tabProviderCache . removeValue ( forKey : tab. id) }
566+ providerCache . remove ( for : tab. id)
574567 return makeRowProvider ( for: tab)
575568 }
576- if let entry = tabProviderCache [ tab. id] ,
577- entry. resultVersion == tab. resultVersion,
578- entry. metadataVersion == tab. metadataVersion,
579- entry. sortState == tab. sortState
580- {
581- return entry. provider
569+ if let cached = providerCache. provider (
570+ for: tab. id,
571+ resultVersion: tab. resultVersion,
572+ metadataVersion: tab. metadataVersion,
573+ sortState: tab. sortState
574+ ) {
575+ return cached
582576 }
583577 let provider = makeRowProvider ( for: tab)
584- Task { @MainActor in
585- tabProviderCache [ tab. id] = RowProviderCacheEntry (
586- provider: provider,
587- resultVersion: tab. resultVersion,
588- metadataVersion: tab. metadataVersion,
589- sortState: tab. sortState
590- )
591- }
578+ providerCache. store (
579+ provider,
580+ for: tab. id,
581+ resultVersion: tab. resultVersion,
582+ metadataVersion: tab. metadataVersion,
583+ sortState: tab. sortState
584+ )
592585 return provider
593586 }
594587
595588 private func cacheRowProvider( for tab: QueryTab ) {
596589 let provider = makeRowProvider ( for: tab)
597- tabProviderCache [ tab. id] = RowProviderCacheEntry (
598- provider: provider,
590+ providerCache. store (
591+ provider,
592+ for: tab. id,
599593 resultVersion: tab. resultVersion,
600594 metadataVersion: tab. metadataVersion,
601595 sortState: tab. sortState
0 commit comments