Skip to content

Commit

Permalink
refactor: change creating trigger API
Browse files Browse the repository at this point in the history
  • Loading branch information
luantranminh committed Jul 1, 2024
1 parent 4488da1 commit a2a065e
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 9 deletions.
15 changes: 11 additions & 4 deletions gormschema/gorm.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ type (
isTriggerOption()
apply(*schemaBuilder)
}
Trigger struct {
opts []TriggerOption
}
// ViewDefiner defines a view.
ViewDefiner interface {
ViewDef(dialect string) []ViewOption
Expand Down Expand Up @@ -77,6 +80,10 @@ func New(dialect string, opts ...Option) *Loader {
return l
}

func NewTrigger(opts ...TriggerOption) Trigger {
return Trigger{opts: opts}
}

func (s schemaOption) apply(b *schemaBuilder) {
s(b)
}
Expand Down Expand Up @@ -364,14 +371,14 @@ func (m *migrator) orderModels(models ...any) ([]any, error) {
func (m *migrator) CreateTriggers(models []any) error {
for _, model := range models {
if md, ok := model.(interface {
Triggers(string) [][]TriggerOption
Triggers(string) []Trigger
}); ok {
for _, options := range md.Triggers(m.Dialector.Name()) {
for _, trigger := range md.Triggers(m.Dialector.Name()) {
schemaBuilder := &schemaBuilder{
db: m.DB,
}
for _, option := range options {
option.apply(schemaBuilder)
for _, opt := range trigger.opts {
opt.apply(schemaBuilder)
if err := m.DB.Exec(schemaBuilder.createStmt).Error; err != nil {
return err
}
Expand Down
1 change: 0 additions & 1 deletion gormschema/gorm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ func TestSQLiteConfig(t *testing.T) {
models.WorkingAgedUsers{},
models.Pet{},
models.UserPetHistory{},
models.User{},
ckmodels.Event{},
ckmodels.Location{},
models.TopPetOwner{},
Expand Down
14 changes: 14 additions & 0 deletions gormschema/testdata/mysql_deterministic_output
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,22 @@ CREATE TABLE `hobbies` (`id` bigint unsigned AUTO_INCREMENT,`name` longtext,PRIM
CREATE TABLE `users` (`id` bigint unsigned AUTO_INCREMENT,`created_at` datetime(3) NULL,`updated_at` datetime(3) NULL,`deleted_at` datetime(3) NULL,`name` longtext,`age` bigint,PRIMARY KEY (`id`),INDEX `idx_users_deleted_at` (`deleted_at`));
CREATE TABLE `user_hobbies` (`user_id` bigint unsigned,`hobby_id` bigint unsigned,PRIMARY KEY (`user_id`,`hobby_id`));
CREATE TABLE `pets` (`id` bigint unsigned AUTO_INCREMENT,`created_at` datetime(3) NULL,`updated_at` datetime(3) NULL,`deleted_at` datetime(3) NULL,`name` longtext,`user_id` bigint unsigned,PRIMARY KEY (`id`),INDEX `idx_pets_deleted_at` (`deleted_at`));
CREATE TABLE `user_pet_histories` (`user_id` bigint unsigned,`pet_id` bigint unsigned,`created_at` datetime(3) NULL,PRIMARY KEY (`user_id`,`pet_id`));
CREATE VIEW top_pet_owners AS SELECT user_id, COUNT(id) AS pet_count FROM pets GROUP BY user_id ORDER BY pet_count DESC LIMIT 10;
CREATE VIEW working_aged_users AS SELECT name, age FROM `users` WHERE age BETWEEN 18 AND 65;
CREATE TRIGGER trg_insert_user_pet_history
AFTER INSERT ON pets
FOR EACH ROW
BEGIN
INSERT INTO user_pet_histories (user_id, pet_id, created_at)
VALUES (NEW.user_id, NEW.id, NOW(3));
END;
CREATE TRIGGER trg_adding_heart_on_pet
BEFORE INSERT ON pets
FOR EACH ROW
BEGIN
SET NEW.name = CONCAT(NEW.name, ' ❤️');
END;
ALTER TABLE `user_hobbies` ADD CONSTRAINT `fk_user_hobbies_hobby` FOREIGN KEY (`hobby_id`) REFERENCES `hobbies`(`id`);
ALTER TABLE `user_hobbies` ADD CONSTRAINT `fk_user_hobbies_user` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`);
ALTER TABLE `pets` ADD CONSTRAINT `fk_users_pets` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`);
2 changes: 2 additions & 0 deletions gormschema/testdata/sqlite_no_fk
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ CREATE TABLE `users` (`id` integer,`created_at` datetime,`updated_at` datetime,`
CREATE INDEX `idx_users_deleted_at` ON `users`(`deleted_at`);
CREATE TABLE `pets` (`id` integer,`created_at` datetime,`updated_at` datetime,`deleted_at` datetime,`name` text,`user_id` integer,PRIMARY KEY (`id`));
CREATE INDEX `idx_pets_deleted_at` ON `pets`(`deleted_at`);
CREATE TABLE `hobbies` (`id` integer,`name` text,PRIMARY KEY (`id`));
CREATE TABLE `user_hobbies` (`hobby_id` integer,`user_id` integer,PRIMARY KEY (`hobby_id`,`user_id`));
CREATE TRIGGER trg_insert_user_pet_history
AFTER INSERT ON pets
BEGIN
Expand Down
8 changes: 4 additions & 4 deletions internal/testdata/models/pet.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ type UserPetHistory struct {
CreatedAt time.Time
}

func (Pet) Triggers(dialect string) [][]gormschema.TriggerOption {
func (Pet) Triggers(dialect string) []gormschema.Trigger {
var stmt1, stmt2 string
switch dialect {
case "mysql":
Expand Down Expand Up @@ -126,8 +126,8 @@ BEGIN
END`
}

return [][]gormschema.TriggerOption{
[]gormschema.TriggerOption{gormschema.CreateStmt(stmt1)},
[]gormschema.TriggerOption{gormschema.CreateStmt(stmt2)},
return []gormschema.Trigger{
gormschema.NewTrigger(gormschema.CreateStmt(stmt1)),
gormschema.NewTrigger(gormschema.CreateStmt(stmt2)),
}
}

0 comments on commit a2a065e

Please sign in to comment.