Support MySQL table & index creation

This commit is contained in:
Denis Arh
2022-09-14 12:18:43 +02:00
parent 58d26c91a2
commit 1f85b1be2b
11 changed files with 74 additions and 42 deletions
+3 -3
View File
@@ -44,13 +44,13 @@ var Session = &dal.Model{
&dal.Attribute{
Ident: "EventType", Sortable: true,
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 32},
Store: &dal.CodecAlias{Ident: "event_type"},
},
&dal.Attribute{
Ident: "ResourceType", Sortable: true,
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 64},
Store: &dal.CodecAlias{Ident: "resource_type"},
},
@@ -250,7 +250,7 @@ var Trigger = &dal.Model{
&dal.Attribute{
Ident: "ResourceType", Sortable: true,
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 64},
Store: &dal.CodecAlias{Ident: "resource_type"},
},
+1 -1
View File
@@ -935,7 +935,7 @@ var RecordRevision = &dal.Model{
&dal.Attribute{
Ident: "Revision",
Type: &dal.TypeNumber{Precision: -1, Scale: -1},
Type: &dal.TypeNumber{Precision: -1, Scale: -1, Meta: map[string]interface{}{"rdbms:type": "integer"}},
Store: &dal.CodecAlias{Ident: "revision"},
},
+1 -1
View File
@@ -69,7 +69,7 @@ func CreateIndexTemplates(base *CreateIndex, ii ...*Index) []any {
return tt
}
// Exec is an utility for executing series of commands
// Exec is a utility for executing series of commands
//
// Parameters can be string, Stringer interface or goqu's exp.SQLExpression
//
+10 -2
View File
@@ -89,11 +89,19 @@ func JsonPath(pp ...any) string {
func IndexFieldModifiers(attr *dal.Attribute, quoteIdent func(i string) string, mm ...dal.IndexFieldModifier) (string, error) {
var (
out = quoteIdent(attr.StoreIdent())
modifier string
out = quoteIdent(attr.StoreIdent())
)
for _, m := range mm {
out = fmt.Sprintf("%s(%s)", m, out)
switch m {
case dal.IndexFieldModifierLower:
modifier = "LOWER"
default:
return "", fmt.Errorf("unknown index field modifier: %s", m)
}
out = fmt.Sprintf("%s(%s)", modifier, out)
}
return out, nil
@@ -32,12 +32,34 @@ func DataDefiner(dbName string, conn *sqlx.DB) *dataDefiner {
}
}
func (dd *dataDefiner) ConvertModel(m *dal.Model) (*ddl.Table, error) {
return ddl.ConvertModel(m, dd.d)
func (dd *dataDefiner) ConvertModel(m *dal.Model) (tbl *ddl.Table, err error) {
tbl, err = ddl.ConvertModel(m, dd.d)
if err != nil {
return
}
// Sadly, MySQL does not support conditional indexes
// We'll solve that on an app level.
//
// We need to prevent these indexes from adding
//
// loop through indexes and remove all with predicate
for i := len(tbl.Indexes) - 1; i >= 0; i-- {
if tbl.Indexes[i].Predicate != "" {
tbl.Indexes = append(tbl.Indexes[:i], tbl.Indexes[i+1:]...)
}
}
return
}
func (dd *dataDefiner) TableCreate(ctx context.Context, t *ddl.Table) error {
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{Table: t})
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{
Table: t,
Dialect: dd.d,
OmitIfNotExistsClause: true,
})
}
func (dd *dataDefiner) TableLookup(ctx context.Context, t string) (*ddl.Table, error) {
@@ -75,11 +97,18 @@ func (dd *dataDefiner) IndexLookup(ctx context.Context, i, t string) (*ddl.Index
}
func (dd *dataDefiner) IndexCreate(ctx context.Context, t string, i *ddl.Index) error {
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{Index: i})
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{
Index: i,
Dialect: dd.d,
OmitIfNotExistsClause: true,
})
}
func (dd *dataDefiner) IndexDrop(ctx context.Context, t, i string) error {
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{Ident: exp.NewIdentifierExpression("", t, i)})
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{
Ident: exp.NewIdentifierExpression("", t, i),
Dialect: dd.d,
})
}
//
@@ -143,10 +143,10 @@ func (mysqlDialect) AttributeToColumn(attr *dal.Attribute) (col *ddl.Column, err
switch t := attr.Type.(type) {
case *dal.TypeID:
col.Type.Name = "BIGINT"
col.Type.Name = "BIGINT UNSIGNED"
col.Default = ddl.DefaultID(t.HasDefault, t.DefaultValue)
case *dal.TypeRef:
col.Type.Name = "BIGINT"
col.Type.Name = "BIGINT UNSIGNED"
col.Default = ddl.DefaultID(t.HasDefault, t.DefaultValue)
case *dal.TypeTimestamp:
@@ -180,9 +180,6 @@ func (mysqlDialect) AttributeToColumn(attr *dal.Attribute) (col *ddl.Column, err
case *dal.TypeJSON:
col.Type.Name = "JSON"
if col.Default, err = ddl.DefaultJSON(t.HasDefault, t.DefaultValue); err != nil {
return nil, err
}
case *dal.TypeGeometry:
col.Type.Name = "JSON"
@@ -32,23 +32,7 @@ func (postgresDialect) GOQU() goqu.DialectWrapper { return goquDialectWrapper }
func (postgresDialect) QuoteIdent(i string) string { return quoteIdent + i + quoteIdent }
func (d postgresDialect) IndexFieldModifiers(attr *dal.Attribute, mm ...dal.IndexFieldModifier) (string, error) {
var (
modifier string
out = d.QuoteIdent(attr.StoreIdent())
)
for _, m := range mm {
switch m {
case dal.IndexFieldModifierLower:
modifier = "LOWER"
default:
return "", fmt.Errorf("unknown index field modifier: %s", m)
}
out = fmt.Sprintf("%s(%s)", modifier, out)
}
return out, nil
return drivers.IndexFieldModifiers(attr, d.QuoteIdent, mm...)
}
func (postgresDialect) DeepIdentJSON(ident exp.IdentifierExpression, pp ...any) (exp.LiteralExpression, error) {
@@ -37,7 +37,10 @@ func (dd *dataDefiner) ConvertModel(m *dal.Model) (*ddl.Table, error) {
}
func (dd *dataDefiner) TableCreate(ctx context.Context, t *ddl.Table) error {
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{Table: t})
return ddl.Exec(ctx, dd.conn, &ddl.CreateTable{
Table: t,
Dialect: dd.d,
})
}
func (dd *dataDefiner) TableLookup(ctx context.Context, t string) (*ddl.Table, error) {
@@ -75,11 +78,17 @@ func (dd *dataDefiner) IndexLookup(ctx context.Context, i, t string) (*ddl.Index
}
func (dd *dataDefiner) IndexCreate(ctx context.Context, t string, i *ddl.Index) error {
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{Index: i})
return ddl.Exec(ctx, dd.conn, &ddl.CreateIndex{
Index: i,
Dialect: dd.d,
})
}
func (dd *dataDefiner) IndexDrop(ctx context.Context, t, i string) error {
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{Ident: exp.NewIdentifierExpression("", t, i)})
return ddl.Exec(ctx, dd.conn, &ddl.DropIndex{
Ident: exp.NewIdentifierExpression("", t, i),
Dialect: dd.d,
})
}
//
+5
View File
@@ -83,6 +83,11 @@ func createTablesFromModels(ctx context.Context, log *zap.Logger, dd ddl.DataDef
}
for _, idx := range tbl.Indexes {
if idx.Ident == ddl.PRIMARY_KEY {
// @todo move this decision to drivers!
continue
}
if err = dd.IndexCreate(ctx, tbl.Ident, idx); err != nil {
return fmt.Errorf("can not create index %q on table %q: %w", idx.Ident, tbl.Ident, err)
}
+2 -2
View File
@@ -168,7 +168,7 @@ var Flag = &dal.Model{
Attributes: dal.AttributeSet{
&dal.Attribute{
Ident: "Kind",
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 64},
Store: &dal.CodecAlias{Ident: "kind"},
},
@@ -193,7 +193,7 @@ var Flag = &dal.Model{
&dal.Attribute{
Ident: "Name",
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 512},
Store: &dal.CodecAlias{Ident: "name"},
},
+3 -3
View File
@@ -1910,13 +1910,13 @@ var ResourceTranslation = &dal.Model{
&dal.Attribute{
Ident: "Lang",
Type: &dal.TypeText{Length: 128},
Type: &dal.TypeText{Length: 32},
Store: &dal.CodecAlias{Ident: "lang"},
},
&dal.Attribute{
Ident: "Resource",
Type: &dal.TypeText{Length: 512},
Type: &dal.TypeText{Length: 256},
Store: &dal.CodecAlias{Ident: "resource"},
},
@@ -2258,7 +2258,7 @@ var Template = &dal.Model{
&dal.Attribute{
Ident: "Language", Sortable: true,
Type: &dal.TypeText{},
Type: &dal.TypeText{Length: 32},
Store: &dal.CodecAlias{Ident: "language"},
},