From f4aeb83f8c01caa50b719ba3dc2cd69dd0e1067d Mon Sep 17 00:00:00 2001 From: Taichi Sasaki Date: Mon, 16 Dec 2019 23:13:56 +0900 Subject: [PATCH 1/4] Add a byte slice field to test model --- .../generator/test/autogenerated_models.go | 54 +++++++++++++++++++ internal/queryset/generator/test/models.go | 7 +-- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/internal/queryset/generator/test/autogenerated_models.go b/internal/queryset/generator/test/autogenerated_models.go index 21f6a4e..bd5fea4 100644 --- a/internal/queryset/generator/test/autogenerated_models.go +++ b/internal/queryset/generator/test/autogenerated_models.go @@ -1959,6 +1959,12 @@ func (qs UserQuerySet) OrderAscByName() UserQuerySet { return qs.w(qs.db.Order("name ASC")) } +// OrderAscByPassword is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OrderAscByPassword() UserQuerySet { + return qs.w(qs.db.Order("password ASC")) +} + // OrderAscBySurname is an autogenerated method // nolint: dupl func (qs UserQuerySet) OrderAscBySurname() UserQuerySet { @@ -2001,6 +2007,12 @@ func (qs UserQuerySet) OrderDescByName() UserQuerySet { return qs.w(qs.db.Order("name DESC")) } +// OrderDescByPassword is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) OrderDescByPassword() UserQuerySet { + return qs.w(qs.db.Order("password DESC")) +} + // OrderDescBySurname is an autogenerated method // nolint: dupl func (qs UserQuerySet) OrderDescBySurname() UserQuerySet { @@ -2013,6 +2025,38 @@ func (qs UserQuerySet) OrderDescByUpdatedAt() UserQuerySet { return qs.w(qs.db.Order("updated_at DESC")) } +// PasswordEq is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) PasswordEq(password []byte) UserQuerySet { + return qs.w(qs.db.Where("password = ?", password)) +} + +// PasswordIn is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) PasswordIn(password ...[]byte) UserQuerySet { + if len(password) == 0 { + qs.db.AddError(errors.New("must at least pass one password in PasswordIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("password IN (?)", password)) +} + +// PasswordNe is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) PasswordNe(password []byte) UserQuerySet { + return qs.w(qs.db.Where("password != ?", password)) +} + +// PasswordNotIn is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) PasswordNotIn(password ...[]byte) UserQuerySet { + if len(password) == 0 { + qs.db.AddError(errors.New("must at least pass one password in PasswordNotIn")) + return qs.w(qs.db) + } + return qs.w(qs.db.Where("password NOT IN (?)", password)) +} + // SurnameEq is an autogenerated method // nolint: dupl func (qs UserQuerySet) SurnameEq(surname string) UserQuerySet { @@ -2164,6 +2208,13 @@ func (u UserUpdater) SetName(name string) UserUpdater { return u } +// SetPassword is an autogenerated method +// nolint: dupl +func (u UserUpdater) SetPassword(password []byte) UserUpdater { + u.fields[string(UserDBSchema.Password)] = password + return u +} + // SetSurname is an autogenerated method // nolint: dupl func (u UserUpdater) SetSurname(surname *string) UserUpdater { @@ -2213,6 +2264,7 @@ var UserDBSchema = struct { Name UserDBSchemaField Surname UserDBSchemaField Email UserDBSchemaField + Password UserDBSchemaField }{ ID: UserDBSchemaField("id"), @@ -2222,6 +2274,7 @@ var UserDBSchema = struct { Name: UserDBSchemaField("name"), Surname: UserDBSchemaField("user_surname"), Email: UserDBSchemaField("email"), + Password: UserDBSchemaField("password"), } // Update updates User fields by primary key @@ -2235,6 +2288,7 @@ func (o *User) Update(db *gorm.DB, fields ...UserDBSchemaField) error { "name": o.Name, "user_surname": o.Surname, "email": o.Email, + "password": o.Password, } u := map[string]interface{}{} for _, f := range fields { diff --git a/internal/queryset/generator/test/models.go b/internal/queryset/generator/test/models.go index 7ec12fe..46d9cce 100644 --- a/internal/queryset/generator/test/models.go +++ b/internal/queryset/generator/test/models.go @@ -13,9 +13,10 @@ type User struct { gorm.Model //Posts []Post - Name string - Surname *string `gorm:"column:user_surname"` - Email string + Name string + Surname *string `gorm:"column:user_surname"` + Email string + Password []byte } // Blog is a blog From 909e0bd4c8c59d01595227af382ad115e3d3f197 Mon Sep 17 00:00:00 2001 From: Taichi Sasaki Date: Mon, 16 Dec 2019 23:16:31 +0900 Subject: [PATCH 2/4] Use types.Byte to assert a byte slice --- internal/queryset/field/field.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/queryset/field/field.go b/internal/queryset/field/field.go index 0b7e344..7bce635 100644 --- a/internal/queryset/field/field.go +++ b/internal/queryset/field/field.go @@ -125,9 +125,12 @@ func (g InfoGenerator) GenFieldInfo(f Field) *Info { BaseInfo: bi, } case *types.Slice: - if t.Elem().String() == "byte" { - return &Info{ - BaseInfo: bi, + switch u := t.Elem().Underlying().(type) { + case *types.Basic: + if u.Kind() == types.Byte { + return &Info{ + BaseInfo: bi, + } } } return nil From e05879837f7d5cc4973f880dc055204b68f4d7a7 Mon Sep 17 00:00:00 2001 From: Taichi Sasaki Date: Mon, 16 Dec 2019 23:21:09 +0900 Subject: [PATCH 3/4] Support preload for struct slice --- internal/queryset/field/field.go | 7 +++++++ internal/queryset/generator/methodsbuilder.go | 4 ++++ internal/queryset/generator/test/autogenerated_models.go | 9 +++++++++ internal/queryset/generator/test/models.go | 2 +- 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/internal/queryset/field/field.go b/internal/queryset/field/field.go index 7bce635..644b084 100644 --- a/internal/queryset/field/field.go +++ b/internal/queryset/field/field.go @@ -23,6 +23,7 @@ type Info struct { pointed *BaseInfo BaseInfo IsPointer bool + IsSlice bool } func (fi Info) GetPointed() Info { @@ -132,6 +133,12 @@ func (g InfoGenerator) GenFieldInfo(f Field) *Info { BaseInfo: bi, } } + case *types.Struct: + bi.IsStruct = true + return &Info{ + BaseInfo: bi, + IsSlice: true, + } } return nil case *types.Named: diff --git a/internal/queryset/generator/methodsbuilder.go b/internal/queryset/generator/methodsbuilder.go index 514be3e..cf55818 100644 --- a/internal/queryset/generator/methodsbuilder.go +++ b/internal/queryset/generator/methodsbuilder.go @@ -94,6 +94,10 @@ func (b *methodsBuilder) buildUpdaterStructMethods() { } func (b *methodsBuilder) buildUpdaterFieldMethods(f field.Info) { + if f.IsSlice { + return + } + if f.IsPointer { p := f.GetPointed() if p.IsStruct { diff --git a/internal/queryset/generator/test/autogenerated_models.go b/internal/queryset/generator/test/autogenerated_models.go index bd5fea4..d34db2a 100644 --- a/internal/queryset/generator/test/autogenerated_models.go +++ b/internal/queryset/generator/test/autogenerated_models.go @@ -2057,6 +2057,12 @@ func (qs UserQuerySet) PasswordNotIn(password ...[]byte) UserQuerySet { return qs.w(qs.db.Where("password NOT IN (?)", password)) } +// PreloadPosts is an autogenerated method +// nolint: dupl +func (qs UserQuerySet) PreloadPosts() UserQuerySet { + return qs.w(qs.db.Preload("Posts")) +} + // SurnameEq is an autogenerated method // nolint: dupl func (qs UserQuerySet) SurnameEq(surname string) UserQuerySet { @@ -2261,6 +2267,7 @@ var UserDBSchema = struct { CreatedAt UserDBSchemaField UpdatedAt UserDBSchemaField DeletedAt UserDBSchemaField + Posts UserDBSchemaField Name UserDBSchemaField Surname UserDBSchemaField Email UserDBSchemaField @@ -2271,6 +2278,7 @@ var UserDBSchema = struct { CreatedAt: UserDBSchemaField("created_at"), UpdatedAt: UserDBSchemaField("updated_at"), DeletedAt: UserDBSchemaField("deleted_at"), + Posts: UserDBSchemaField("posts"), Name: UserDBSchemaField("name"), Surname: UserDBSchemaField("user_surname"), Email: UserDBSchemaField("email"), @@ -2285,6 +2293,7 @@ func (o *User) Update(db *gorm.DB, fields ...UserDBSchemaField) error { "created_at": o.CreatedAt, "updated_at": o.UpdatedAt, "deleted_at": o.DeletedAt, + "posts": o.Posts, "name": o.Name, "user_surname": o.Surname, "email": o.Email, diff --git a/internal/queryset/generator/test/models.go b/internal/queryset/generator/test/models.go index 46d9cce..a9e6af6 100644 --- a/internal/queryset/generator/test/models.go +++ b/internal/queryset/generator/test/models.go @@ -12,7 +12,7 @@ import ( type User struct { gorm.Model - //Posts []Post + Posts []Post Name string Surname *string `gorm:"column:user_surname"` Email string From f42725214ab1aa69de43b7f88529510077d57b28 Mon Sep 17 00:00:00 2001 From: Taichi Sasaki Date: Tue, 17 Dec 2019 00:29:37 +0900 Subject: [PATCH 4/4] Fix tests --- internal/queryset/generator/queryset_test.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/internal/queryset/generator/queryset_test.go b/internal/queryset/generator/queryset_test.go index 95d7414..91f349f 100644 --- a/internal/queryset/generator/queryset_test.go +++ b/internal/queryset/generator/queryset_test.go @@ -28,6 +28,8 @@ import ( const testSurname = "Ivanov" +var testPassword = "Password" + func fixedFullRe(s string) string { return fmt.Sprintf("^%s$", regexp.QuoteMeta(s)) } @@ -290,11 +292,14 @@ func runUserQueryFilterSubTest(t *testing.T, c userQueryTestCase, m sqlmock.Sqlm func testUserCreateOne(t *testing.T, m sqlmock.Sqlmock, db *gorm.DB) { u := getUserNoID() - req := "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`user_surname`,`email`) " + - "VALUES (?,?,?,?,?,?)" + req := "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`user_surname`,`email`,`password`) " + + "VALUES (?,?,?,?,?,?,?)" + + password := []byte(testPassword) + u.Password = password args := []driver.Value{sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg(), - u.Name, nil, u.Email} + u.Name, nil, u.Email, password} m.ExpectExec(fixedFullRe(req)). WithArgs(args...). WillReturnResult(sqlmock.NewResult(2, 1)) @@ -304,14 +309,16 @@ func testUserCreateOne(t *testing.T, m sqlmock.Sqlmock, db *gorm.DB) { func testUserCreateOneWithSurname(t *testing.T, m sqlmock.Sqlmock, db *gorm.DB) { u := getUserNoID() - req := "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`user_surname`,`email`) " + - "VALUES (?,?,?,?,?,?)" + req := "INSERT INTO `users` (`created_at`,`updated_at`,`deleted_at`,`name`,`user_surname`,`email`,`password`) " + + "VALUES (?,?,?,?,?,?,?)" surname := testSurname + password := []byte(testPassword) u.Surname = &surname + u.Password = password args := []driver.Value{sqlmock.AnyArg(), sqlmock.AnyArg(), sqlmock.AnyArg(), - u.Name, &surname, u.Email} + u.Name, &surname, u.Email, password} m.ExpectExec(fixedFullRe(req)). WithArgs(args...). WillReturnResult(sqlmock.NewResult(2, 1))