@@ -3,178 +3,72 @@ package plan
33import (
44 "fmt"
55 "strings"
6- // "time"
76
8- // opentracing "github.com/opentracing/opentracing-go"
9- // otlog "github.com/opentracing/opentracing-go/log"
10- // "github.com/sirupsen/logrus"
117 "github.com/src-d/go-mysql-server/sql"
12- // "github.com/src-d/go-mysql-server/sql/expression"
13- // errors "gopkg.in/src-d/go-errors.v1"
148)
159
1610type CreateView struct {
17- Database sql.Database
18- Name string
19- Columns []string
20- Definition * SubqueryAlias
11+ UnaryNode
12+ Database sql.Database
13+ Name string
14+ Columns []string
15+ Catalog * sql.Catalog
2116}
2217
2318func NewCreateView (
24- database sql.Database ,
25- name string ,
19+ database sql.Database ,
20+ name string ,
2621 columns []string ,
2722 definition * SubqueryAlias ,
2823) * CreateView {
2924 return & CreateView {
30- Database : database ,
31- Name : name ,
32- Columns : columns ,
33- Definition : definition ,
25+ UnaryNode {Child : definition },
26+ database ,
27+ name ,
28+ columns ,
29+ nil ,
3430 }
3531}
3632
3733// Children implements the Node interface.
38- func (c * CreateView ) Children () []sql.Node { return nil }
34+ func (create * CreateView ) Children () []sql.Node {
35+ return []sql.Node {create .Child }
36+ }
3937
4038// Resolved implements the Node interface.
41- func (c * CreateView ) Resolved () bool {
42- _ , ok := c .Database .(sql.UnresolvedDatabase )
43- return ! ok && c .Definition .Resolved ()
39+ func (create * CreateView ) Resolved () bool {
40+ // TOOD: Check whether the database has been resolved
41+ // _, ok := create.Database.(sql.UnresolvedDatabase)
42+ return create .Child .Resolved ()
4443}
45- //
46- // func getIndexableTable(t sql.Table) (sql.IndexableTable, error) {
47- // switch t := t.(type) {
48- // case sql.IndexableTable:
49- // return t, nil
50- // case sql.TableWrapper:
51- // return getIndexableTable(t.Underlying())
52- // default:
53- // return nil, ErrNotIndexable.New()
54- // }
55- // }
56- //
57- // func getChecksumable(t sql.Table) sql.Checksumable {
58- // switch t := t.(type) {
59- // case sql.Checksumable:
60- // return t
61- // case sql.TableWrapper:
62- // return getChecksumable(t.Underlying())
63- // default:
64- // return nil
65- // }
66- // }
67- //
44+
6845// RowIter implements the Node interface.
69- func (c * CreateView ) RowIter (ctx * sql.Context ) (sql.RowIter , error ) {
46+ func (create * CreateView ) RowIter (ctx * sql.Context ) (sql.RowIter , error ) {
7047 // TODO: add it to the register
7148
72- // table, ok := c.Table.(*ResolvedTable)
73- // if !ok {
74- // return nil, ErrNotIndexable.New()
75- // }
76- //
77- // indexable, err := getIndexableTable(table.Table)
78- // if err != nil {
79- // return nil, err
80- // }
81- //
82- // var driver sql.IndexDriver
83- // if c.Driver == "" {
84- // driver = c.Catalog.DefaultIndexDriver()
85- // } else {
86- // driver = c.Catalog.IndexDriver(c.Driver)
87- // }
88- //
89- // if driver == nil {
90- // return nil, ErrInvalidIndexDriver.New(c.Driver)
91- // }
92- //
93- // columns, exprs, err := getColumnsAndPrepareExpressions(c.Exprs)
94- // if err != nil {
95- // return nil, err
96- // }
97- //
98- // for _, e := range exprs {
99- // if e.Type() == sql.Blob || e.Type() == sql.JSON {
100- // return nil, ErrExprTypeNotIndexable.New(e, e.Type())
101- // }
102- // }
103- //
104- // if ch := getChecksumable(table.Table); ch != nil {
105- // c.Config[sql.ChecksumKey], err = ch.Checksum()
106- // if err != nil {
107- // return nil, err
108- // }
109- // }
110- //
111- // index, err := driver.Create(
112- // c.CurrentDatabase,
113- // table.Name(),
114- // c.Name,
115- // exprs,
116- // c.Config,
117- // )
118- // if err != nil {
119- // return nil, err
120- // }
121- //
122- // iter, err := indexable.IndexKeyValues(ctx, columns)
123- // if err != nil {
124- // return nil, err
125- // }
126- //
127- // iter = &evalPartitionKeyValueIter{
128- // ctx: ctx,
129- // columns: columns,
130- // exprs: exprs,
131- // iter: iter,
132- // }
133- //
134- // created, ready, err := c.Catalog.AddIndex(index)
135- // if err != nil {
136- // return nil, err
137- // }
138- //
139- // log := logrus.WithFields(logrus.Fields{
140- // "id": index.ID(),
141- // "driver": index.Driver(),
142- // })
143- //
144- // createIndex := func() {
145- // c.createIndex(ctx, log, driver, index, iter, created, ready)
146- // c.Catalog.ProcessList.Done(ctx.Pid())
147- // }
148- //
149- // log.WithField("async", c.Async).Info("starting to save the index")
150- //
151- // if c.Async {
152- // go createIndex()
153- // } else {
154- // createIndex()
155- // }
156-
15749 return sql .RowsToRowIter (), nil
15850}
15951
16052// Schema implements the Node interface.
161- func (c * CreateView ) Schema () sql.Schema { return nil }
53+ func (create * CreateView ) Schema () sql.Schema { return nil }
16254
16355func (create * CreateView ) String () string {
16456 pr := sql .NewTreePrinter ()
16557 _ = pr .WriteNode ("CreateView(%s)" , create .Name )
16658 _ = pr .WriteChildren (
16759 fmt .Sprintf ("Columns (%s)" , strings .Join (create .Columns , ", " )),
168- fmt .Sprintf ("As (%s)" , create .Definition .String ()),
60+ fmt .Sprintf ("As (%s)" , create .Child .String ()),
16961 )
17062 return pr .String ()
17163}
17264
17365// WithChildren implements the Node interface.
174- func (c * CreateView ) WithChildren (children ... sql.Node ) (sql.Node , error ) {
175- if len (children ) != 0 {
176- return nil , sql .ErrInvalidChildrenNumber .New (c , len (children ), 0 )
66+ func (create * CreateView ) WithChildren (children ... sql.Node ) (sql.Node , error ) {
67+ if len (children ) != 1 {
68+ return nil , sql .ErrInvalidChildrenNumber .New (create , len (children ), 1 )
17769 }
17870
179- return c , nil
71+ newCreate := create
72+ newCreate .Child = children [0 ]
73+ return newCreate , nil
18074}
0 commit comments