Support MySQL table & index creation
This commit is contained in:
Generated
+3
-3
@@ -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"},
|
||||
},
|
||||
|
||||
|
||||
Generated
+1
-1
@@ -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"},
|
||||
},
|
||||
|
||||
|
||||
@@ -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
|
||||
//
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
//
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Generated
+2
-2
@@ -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"},
|
||||
},
|
||||
|
||||
|
||||
Generated
+3
-3
@@ -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"},
|
||||
},
|
||||
|
||||
|
||||
Reference in New Issue
Block a user