mirror of https://github.com/aldy505/bob.git
127 lines
2.5 KiB
Go
127 lines
2.5 KiB
Go
package bob
|
|
|
|
import (
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/lann/builder"
|
|
)
|
|
|
|
type IndexBuilder builder.Builder
|
|
|
|
type indexData struct {
|
|
Unique bool
|
|
Spatial bool
|
|
Fulltext bool
|
|
Name string
|
|
TableName string
|
|
Columns []IndexColumn
|
|
IfNotExists bool
|
|
}
|
|
|
|
type IndexColumn struct {
|
|
Name string
|
|
Extras []string
|
|
Collate string
|
|
}
|
|
|
|
func init() {
|
|
builder.Register(IndexBuilder{}, indexData{})
|
|
}
|
|
|
|
func (i IndexBuilder) Unique() IndexBuilder {
|
|
return builder.Set(i, "Unique", true).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) Spatial() IndexBuilder {
|
|
return builder.Set(i, "Spatial", true).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) Fulltext() IndexBuilder {
|
|
return builder.Set(i, "Fulltext", true).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) name(name string) IndexBuilder {
|
|
return builder.Set(i, "Name", name).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) ifNotExists() IndexBuilder {
|
|
return builder.Set(i, "IfNotExists", true).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) On(table string) IndexBuilder {
|
|
return builder.Set(i, "TableName", table).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) Columns(column IndexColumn) IndexBuilder {
|
|
return builder.Append(i, "Columns", column).(IndexBuilder)
|
|
}
|
|
|
|
func (i IndexBuilder) ToSql() (string, []interface{}, error) {
|
|
data := builder.GetStruct(i).(indexData)
|
|
return data.ToSql()
|
|
}
|
|
|
|
func (i *indexData) ToSql() (sqlStr string, args []interface{}, err error) {
|
|
if i.Name == "" {
|
|
err = errors.New("index name is required on create index statement")
|
|
return
|
|
}
|
|
if i.TableName == "" {
|
|
err = errors.New("a table name must be specified on create index statement")
|
|
return
|
|
}
|
|
|
|
if len(i.Columns) == 0 {
|
|
err = errors.New("should at least specify one column for create index statement")
|
|
return
|
|
}
|
|
|
|
var sql strings.Builder
|
|
|
|
sql.WriteString("CREATE ")
|
|
|
|
if i.Unique {
|
|
sql.WriteString("UNIQUE ")
|
|
}
|
|
|
|
if i.Fulltext {
|
|
sql.WriteString("FULLTEXT ")
|
|
}
|
|
|
|
if i.Spatial {
|
|
sql.WriteString("SPATIAL ")
|
|
}
|
|
|
|
sql.WriteString("INDEX ")
|
|
|
|
if i.IfNotExists {
|
|
sql.WriteString("IF NOT EXISTS ")
|
|
}
|
|
|
|
sql.WriteString(i.Name + " ")
|
|
|
|
sql.WriteString("ON ")
|
|
|
|
sql.WriteString(i.TableName + " ")
|
|
|
|
var columns []string
|
|
for _, column := range i.Columns {
|
|
var colBuilder strings.Builder
|
|
colBuilder.WriteString(column.Name)
|
|
if column.Collate != "" {
|
|
colBuilder.WriteString(" COLLATE " + column.Collate)
|
|
}
|
|
if len(column.Extras) > 0 {
|
|
colBuilder.WriteString(" " + strings.Join(column.Extras, " "))
|
|
}
|
|
columns = append(columns, colBuilder.String())
|
|
}
|
|
|
|
sql.WriteString("(")
|
|
sql.WriteString(strings.Join(columns, ", "))
|
|
sql.WriteString(");")
|
|
|
|
sqlStr = sql.String()
|
|
return
|
|
} |