diff --git a/automation/model/models.gen.go b/automation/model/models.gen.go index d14a95b22..3e1c286c8 100644 --- a/automation/model/models.gen.go +++ b/automation/model/models.gen.go @@ -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"}, }, diff --git a/compose/model/models.gen.go b/compose/model/models.gen.go index ca5383cb1..6549671fc 100644 --- a/compose/model/models.gen.go +++ b/compose/model/models.gen.go @@ -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"}, }, diff --git a/store/adapters/rdbms/ddl/commands.go b/store/adapters/rdbms/ddl/commands.go index 67b6a291b..f55230cec 100644 --- a/store/adapters/rdbms/ddl/commands.go +++ b/store/adapters/rdbms/ddl/commands.go @@ -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 // diff --git a/store/adapters/rdbms/drivers/json.go b/store/adapters/rdbms/drivers/json.go index c344d0032..4bd4630a3 100644 --- a/store/adapters/rdbms/drivers/json.go +++ b/store/adapters/rdbms/drivers/json.go @@ -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 diff --git a/store/adapters/rdbms/drivers/mysql/data_definer.go b/store/adapters/rdbms/drivers/mysql/data_definer.go index ad7dcd76e..d7924bb54 100644 --- a/store/adapters/rdbms/drivers/mysql/data_definer.go +++ b/store/adapters/rdbms/drivers/mysql/data_definer.go @@ -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, + }) } // diff --git a/store/adapters/rdbms/drivers/mysql/dialect.go b/store/adapters/rdbms/drivers/mysql/dialect.go index 180b940c0..d5cb17aca 100644 --- a/store/adapters/rdbms/drivers/mysql/dialect.go +++ b/store/adapters/rdbms/drivers/mysql/dialect.go @@ -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" diff --git a/store/adapters/rdbms/drivers/postgres/dialect.go b/store/adapters/rdbms/drivers/postgres/dialect.go index 0806f24c1..09d56fa61 100644 --- a/store/adapters/rdbms/drivers/postgres/dialect.go +++ b/store/adapters/rdbms/drivers/postgres/dialect.go @@ -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) { diff --git a/store/adapters/rdbms/drivers/sqlite/data_definer.go b/store/adapters/rdbms/drivers/sqlite/data_definer.go index acd1d8820..9ef6d2d72 100644 --- a/store/adapters/rdbms/drivers/sqlite/data_definer.go +++ b/store/adapters/rdbms/drivers/sqlite/data_definer.go @@ -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, + }) } // diff --git a/store/adapters/rdbms/upgrade.go b/store/adapters/rdbms/upgrade.go index d120cd469..74ab73af0 100644 --- a/store/adapters/rdbms/upgrade.go +++ b/store/adapters/rdbms/upgrade.go @@ -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) } diff --git a/system/model/corteza.gen.go b/system/model/corteza.gen.go index bac6f774e..f2a8462c3 100644 --- a/system/model/corteza.gen.go +++ b/system/model/corteza.gen.go @@ -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"}, }, diff --git a/system/model/models.gen.go b/system/model/models.gen.go index a82d0f314..3d6130056 100644 --- a/system/model/models.gen.go +++ b/system/model/models.gen.go @@ -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"}, },