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

Commit 032fa6c

Browse files
Improve View and ViewRegistry interfaces
Signed-off-by: Alejandro García Montoro <alejandro.garciamontoro@gmail.com>
1 parent d71a9a5 commit 032fa6c

File tree

5 files changed

+51
-15
lines changed

5 files changed

+51
-15
lines changed

sql/analyzer/resolve_tables.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func resolveTables(ctx *sql.Context, a *Analyzer, n sql.Node) (sql.Node, error)
5555

5656
if view, err := a.Catalog.ViewRegistry.View(db, name); err == nil {
5757
a.Log("table %q is a view: replacing plans", t.Name())
58-
return view.Definition, nil
58+
return view.Definition(), nil
5959
}
6060
}
6161

sql/analyzer/resolve_tables_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func TestResolveViews(t *testing.T) {
110110
plan.NewResolvedTable(table),
111111
)
112112
subqueryAlias := plan.NewSubqueryAlias("myview", subquery)
113-
view := sql.View{"myview", subqueryAlias}
113+
view := sql.NewView("myview", subqueryAlias)
114114

115115
catalog := sql.NewCatalog()
116116
catalog.AddDatabase(db)

sql/parse/views.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var ErrMalformedViewName = errors.NewKind("the view name '%s' is not correct")
1515
var ErrMalformedCreateView = errors.NewKind("view definition %#v is not a SELECT query")
1616

1717
// Parses
18-
// CREATE [OR REPLACE] VIEW [db_name.]view_name [(col1, col2, ...)] AS select_statement
18+
// CREATE [OR REPLACE] VIEW [db_name.]view_name AS select_statement
1919
// and returns a NewCreateView node in case of success
2020
func parseCreateView(ctx *sql.Context, s string) (sql.Node, error) {
2121
r := bufio.NewReader(strings.NewReader(s))

sql/plan/create_view.go

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ import (
99

1010
type CreateView struct {
1111
UnaryNode
12-
database sql.Database
13-
Name string
14-
Columns []string
15-
Catalog *sql.Catalog
12+
database sql.Database
13+
Name string
14+
Columns []string
15+
Catalog *sql.Catalog
1616
IsReplace bool
1717
}
1818

@@ -33,7 +33,13 @@ func NewCreateView(
3333
}
3434
}
3535

36-
// Children implements the Node interface.
36+
// View returns the view that will be created by this node
37+
func (create *CreateView) View() sql.View {
38+
return sql.NewView(create.Name, create.Child)
39+
}
40+
41+
// Children implements the Node interface. It returns the Child of the
42+
// CreateView node; i.e., the definition of the view that will be created.
3743
func (create *CreateView) Children() []sql.Node {
3844
return []sql.Node{create.Child}
3945
}
@@ -46,10 +52,10 @@ func (create *CreateView) Resolved() bool {
4652

4753
// RowIter implements the Node interface.
4854
func (create *CreateView) RowIter(ctx *sql.Context) (sql.RowIter, error) {
49-
view := sql.View{create.Name, create.Child}
55+
view := sql.NewView(create.Name, create.Child)
5056

5157
if create.IsReplace {
52-
_ = create.Catalog.ViewRegistry.Delete(create.database.Name(), view.Name)
58+
_ = create.Catalog.ViewRegistry.Delete(create.database.Name(), view.Name())
5359
}
5460

5561
return sql.RowsToRowIter(), create.Catalog.ViewRegistry.Register(create.database.Name(), view)

sql/viewregistry.go

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,33 @@ import (
88
)
99

1010
var (
11-
ErrExistingView = errors.NewKind("the view %s.%s already exists in the registry")
11+
ErrExistingView = errors.NewKind("the view %s.%s already exists in the registry")
1212
ErrNonExistingView = errors.NewKind("the view %s.%s does not exist in the registry")
1313
)
1414

15+
// A View is defined by a Node and has a name
1516
type View struct {
16-
Name string
17-
Definition Node
17+
name string
18+
definition Node
1819
}
1920

21+
// Creates a View with the specified name and definition
22+
func NewView(name string, definition Node) View {
23+
return View{name, definition}
24+
}
25+
26+
// Returns the name of the view
27+
func (view *View) Name() string {
28+
return view.name
29+
}
30+
31+
// Returns the definition of the view
32+
func (view *View) Definition() Node {
33+
return view.definition
34+
}
35+
36+
// Views are scoped by the databases in which they were defined, so a key in
37+
// the view registry is a pair of names: database and view
2038
type viewKey struct {
2139
dbName, viewName string
2240
}
@@ -41,10 +59,10 @@ func (registry *ViewRegistry) Register(database string, view View) error {
4159
registry.mutex.Lock()
4260
defer registry.mutex.Unlock()
4361

44-
key := newViewKey(database, view.Name)
62+
key := newViewKey(database, view.Name())
4563

4664
if _, ok := registry.views[key]; ok {
47-
return ErrExistingView.New(database, view.Name)
65+
return ErrExistingView.New(database, view.Name())
4866
}
4967

5068
registry.views[key] = view
@@ -54,6 +72,9 @@ func (registry *ViewRegistry) Register(database string, view View) error {
5472
// Deletes the view specified by the pair {databaseName, viewName}, returning
5573
// an error if it does not exist
5674
func (registry *ViewRegistry) Delete(databaseName, viewName string) error {
75+
registry.mutex.Lock()
76+
defer registry.mutex.Unlock()
77+
5778
key := newViewKey(databaseName, viewName)
5879

5980
if _, ok := registry.views[key]; !ok {
@@ -77,6 +98,15 @@ func (registry *ViewRegistry) View(databaseName, viewName string) (*View, error)
7798
return nil, ErrNonExistingView.New(databaseName, viewName)
7899
}
79100

101+
// Returns the map of all views in the registry
102+
func (registry *ViewRegistry) AllViews() map[viewKey]View {
103+
registry.mutex.RLock()
104+
defer registry.mutex.RUnlock()
105+
106+
return registry.views
107+
}
108+
109+
// Returns an array of all the views registered under the specified database
80110
func (registry *ViewRegistry) ViewsInDatabase(databaseName string) (views []View) {
81111
registry.mutex.RLock()
82112
defer registry.mutex.RUnlock()

0 commit comments

Comments
 (0)