Skip to content
This repository was archived by the owner on Jan 28, 2021. It is now read-only.

Commit fc97414

Browse files
Add Exists and DeleteList to ViewRegistry
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
1 parent 02c010c commit fc97414

File tree

2 files changed

+150
-21
lines changed

2 files changed

+150
-21
lines changed

sql/viewregistry.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,29 @@ func (r *ViewRegistry) Delete(databaseName, viewName string) error {
9090
return nil
9191
}
9292

93+
// DeleteList tries to delete a list of view keys.
94+
// If the list contains views that do exist and views that do not, the existing
95+
// views are deleted if and only if the errIfNotExists flag is set to false; if
96+
// it is set to true, no views are deleted and an error is returned.
97+
func (r *ViewRegistry) DeleteList(keys []ViewKey, errIfNotExists bool) error {
98+
r.mutex.Lock()
99+
defer r.mutex.Unlock()
100+
101+
if errIfNotExists {
102+
for _, key := range keys {
103+
if !r.exists(key.dbName, key.viewName) {
104+
return ErrNonExistingView.New(key.dbName, key.viewName)
105+
}
106+
}
107+
}
108+
109+
for _, key := range keys {
110+
delete(r.views, key)
111+
}
112+
113+
return nil
114+
}
115+
93116
// View returns a pointer to the view specified by the pair {databaseName,
94117
// viewName}, returning an error if it does not exist.
95118
func (r *ViewRegistry) View(databaseName, viewName string) (*View, error) {
@@ -127,3 +150,18 @@ func (r *ViewRegistry) ViewsInDatabase(databaseName string) (views []View) {
127150

128151
return views
129152
}
153+
154+
func (r *ViewRegistry) exists(databaseName, viewName string) bool {
155+
key := NewViewKey(databaseName, viewName)
156+
_, ok := r.views[key]
157+
158+
return ok
159+
}
160+
161+
// Exists returns whether the specified key is already registered
162+
func (r *ViewRegistry) Exists(databaseName, viewName string) bool {
163+
r.mutex.RLock()
164+
defer r.mutex.RUnlock()
165+
166+
return r.exists(databaseName, viewName)
167+
}

sql/viewregistry_test.go

Lines changed: 112 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,16 @@ var (
1212
mockView = NewView(viewName, nil)
1313
)
1414

15+
func newMockRegistry(require *require.Assertions) *ViewRegistry {
16+
registry := NewViewRegistry()
17+
18+
err := registry.Register(dbName, mockView)
19+
require.NoError(err)
20+
require.Equal(1, len(registry.AllViews()))
21+
22+
return registry
23+
}
24+
1525
// Tests the creation of an empty ViewRegistry with no views registered.
1626
func TestNewViewRegistry(t *testing.T) {
1727
require := require.New(t)
@@ -24,11 +34,7 @@ func TestNewViewRegistry(t *testing.T) {
2434
func TestRegisterNonExistingView(t *testing.T) {
2535
require := require.New(t)
2636

27-
registry := NewViewRegistry()
28-
29-
err := registry.Register(dbName, mockView)
30-
require.NoError(err)
31-
require.Equal(1, len(registry.AllViews()))
37+
registry := newMockRegistry(require)
3238

3339
actualView, err := registry.View(dbName, viewName)
3440
require.NoError(err)
@@ -39,13 +45,9 @@ func TestRegisterNonExistingView(t *testing.T) {
3945
func TestRegisterExistingVIew(t *testing.T) {
4046
require := require.New(t)
4147

42-
registry := NewViewRegistry()
48+
registry := newMockRegistry(require)
4349

4450
err := registry.Register(dbName, mockView)
45-
require.NoError(err)
46-
require.Equal(1, len(registry.AllViews()))
47-
48-
err = registry.Register(dbName, mockView)
4951
require.Error(err)
5052
require.True(ErrExistingView.Is(err))
5153
}
@@ -54,13 +56,9 @@ func TestRegisterExistingVIew(t *testing.T) {
5456
func TestDeleteExistingView(t *testing.T) {
5557
require := require.New(t)
5658

57-
registry := NewViewRegistry()
58-
59-
err := registry.Register(dbName, mockView)
60-
require.NoError(err)
61-
require.Equal(1, len(registry.AllViews()))
59+
registry := newMockRegistry(require)
6260

63-
err = registry.Delete(dbName, viewName)
61+
err := registry.Delete(dbName, viewName)
6462
require.NoError(err)
6563
require.Equal(0, len(registry.AllViews()))
6664
}
@@ -81,11 +79,7 @@ func TestDeleteNonExistingView(t *testing.T) {
8179
func TestGetExistingView(t *testing.T) {
8280
require := require.New(t)
8381

84-
registry := NewViewRegistry()
85-
86-
err := registry.Register(dbName, mockView)
87-
require.NoError(err)
88-
require.Equal(1, len(registry.AllViews()))
82+
registry := newMockRegistry(require)
8983

9084
actualView, err := registry.View(dbName, viewName)
9185
require.NoError(err)
@@ -131,3 +125,100 @@ func TestViewsInDatabase(t *testing.T) {
131125
require.Equal(db.numViews, len(views))
132126
}
133127
}
128+
129+
var viewKeys = []ViewKey{
130+
{
131+
"db1",
132+
"view1",
133+
},
134+
{
135+
"db1",
136+
"view2",
137+
},
138+
{
139+
"db2",
140+
"view1",
141+
},
142+
}
143+
144+
func registerKeys(registry *ViewRegistry, require *require.Assertions) {
145+
for _, key := range viewKeys {
146+
err := registry.Register(key.dbName, NewView(key.viewName, nil))
147+
require.NoError(err)
148+
}
149+
require.Equal(len(viewKeys), len(registry.AllViews()))
150+
}
151+
152+
func TestDeleteExistingList(t *testing.T) {
153+
require := require.New(t)
154+
155+
test := func(errIfNotExists bool) {
156+
registry := NewViewRegistry()
157+
158+
registerKeys(registry, require)
159+
err := registry.DeleteList(viewKeys, errIfNotExists)
160+
require.NoError(err)
161+
require.Equal(0, len(registry.AllViews()))
162+
}
163+
164+
test(true)
165+
test(false)
166+
}
167+
168+
func TestDeleteNonExistingList(t *testing.T) {
169+
require := require.New(t)
170+
171+
test := func(errIfNotExists bool) {
172+
registry := NewViewRegistry()
173+
174+
registerKeys(registry, require)
175+
err := registry.DeleteList([]ViewKey{{"random", "random"}}, errIfNotExists)
176+
if errIfNotExists {
177+
require.Error(err)
178+
} else {
179+
require.NoError(err)
180+
}
181+
require.Equal(len(viewKeys), len(registry.AllViews()))
182+
}
183+
184+
test(false)
185+
test(true)
186+
}
187+
188+
func TestDeletePartiallyExistingList(t *testing.T) {
189+
require := require.New(t)
190+
191+
test := func(errIfNotExists bool) {
192+
registry := NewViewRegistry()
193+
194+
registerKeys(registry, require)
195+
toDelete := append(viewKeys, ViewKey{"random", "random"})
196+
err := registry.DeleteList(toDelete, errIfNotExists)
197+
if errIfNotExists {
198+
require.Error(err)
199+
require.Equal(len(viewKeys), len(registry.AllViews()))
200+
} else {
201+
require.NoError(err)
202+
require.Equal(0, len(registry.AllViews()))
203+
}
204+
}
205+
206+
test(false)
207+
test(true)
208+
}
209+
210+
func TestExistsOnExistingView(t *testing.T) {
211+
require := require.New(t)
212+
213+
registry := newMockRegistry(require)
214+
215+
require.True(registry.Exists(dbName, viewName))
216+
}
217+
218+
func TestExistsOnNonExistingView(t *testing.T) {
219+
require := require.New(t)
220+
221+
registry := newMockRegistry(require)
222+
223+
require.False(registry.Exists("non", "existing"))
224+
}

0 commit comments

Comments
 (0)