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  }