github.com/mithrandie/csvq@v1.18.1/lib/query/uncommitted_views.go (about) 1 package query 2 3 import ( 4 "sync" 5 ) 6 7 type UncommittedViews struct { 8 mtx *sync.RWMutex 9 Created map[string]*FileInfo 10 Updated map[string]*FileInfo 11 } 12 13 func NewUncommittedViews() UncommittedViews { 14 return UncommittedViews{ 15 mtx: &sync.RWMutex{}, 16 Created: make(map[string]*FileInfo), 17 Updated: make(map[string]*FileInfo), 18 } 19 } 20 21 func (m *UncommittedViews) SetForCreatedView(fileInfo *FileInfo) { 22 ufpath := fileInfo.IdentifiedPath() 23 24 m.mtx.Lock() 25 defer m.mtx.Unlock() 26 27 if _, ok := m.Created[ufpath]; !ok { 28 if _, ok := m.Updated[ufpath]; !ok { 29 m.Created[ufpath] = fileInfo 30 } 31 } 32 } 33 34 func (m *UncommittedViews) SetForUpdatedView(fileInfo *FileInfo) { 35 ufpath := fileInfo.IdentifiedPath() 36 37 m.mtx.Lock() 38 defer m.mtx.Unlock() 39 40 if _, ok := m.Created[ufpath]; !ok { 41 if _, ok := m.Updated[ufpath]; !ok { 42 m.Updated[ufpath] = fileInfo 43 } 44 } 45 } 46 47 func (m *UncommittedViews) Unset(fileInfo *FileInfo) { 48 ufpath := fileInfo.IdentifiedPath() 49 50 m.mtx.Lock() 51 defer m.mtx.Unlock() 52 53 if _, ok := m.Updated[ufpath]; ok { 54 delete(m.Updated, ufpath) 55 return 56 } 57 58 if _, ok := m.Created[ufpath]; ok { 59 delete(m.Created, ufpath) 60 } 61 } 62 63 func (m *UncommittedViews) Clean() { 64 m.mtx.Lock() 65 defer m.mtx.Unlock() 66 67 for k := range m.Updated { 68 delete(m.Updated, k) 69 } 70 for k := range m.Created { 71 delete(m.Created, k) 72 } 73 } 74 75 func (m *UncommittedViews) UncommittedFiles() (map[string]*FileInfo, map[string]*FileInfo) { 76 m.mtx.RLock() 77 defer m.mtx.RUnlock() 78 79 var createdFiles = make(map[string]*FileInfo) 80 var updatedFiles = make(map[string]*FileInfo) 81 82 for k, v := range m.Created { 83 if v.IsFile() { 84 createdFiles[k] = v 85 } 86 } 87 for k, v := range m.Updated { 88 if v.IsFile() { 89 updatedFiles[k] = v 90 } 91 } 92 93 return createdFiles, updatedFiles 94 } 95 96 func (m *UncommittedViews) UncommittedTempViews() map[string]*FileInfo { 97 m.mtx.RLock() 98 defer m.mtx.RUnlock() 99 100 var updatedViews = map[string]*FileInfo{} 101 102 for k, v := range m.Updated { 103 if v.IsInMemoryTable() { 104 updatedViews[k] = v 105 } 106 } 107 108 return updatedViews 109 } 110 111 func (m *UncommittedViews) IsEmpty() bool { 112 m.mtx.RLock() 113 defer m.mtx.RUnlock() 114 115 if 0 < len(m.Created) { 116 return false 117 } 118 if 0 < len(m.Updated) { 119 return false 120 } 121 return true 122 } 123 124 func (m *UncommittedViews) CountCreatedTables() int { 125 m.mtx.RLock() 126 defer m.mtx.RUnlock() 127 128 return len(m.Created) 129 } 130 131 func (m *UncommittedViews) CountUpdatedTables() int { 132 m.mtx.RLock() 133 defer m.mtx.RUnlock() 134 135 cnt := 0 136 for _, v := range m.Updated { 137 if v.IsFile() { 138 cnt++ 139 } 140 } 141 return cnt 142 } 143 144 func (m *UncommittedViews) CountUpdatedViews() int { 145 m.mtx.RLock() 146 defer m.mtx.RUnlock() 147 148 cnt := 0 149 for _, v := range m.Updated { 150 if v.IsInMemoryTable() { 151 cnt++ 152 } 153 } 154 return cnt 155 }