From c2b48c7c3900ae1650944b695a9190000c63edab Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sat, 27 Jan 2024 20:49:18 +0330 Subject: [PATCH 1/4] feat: add OrWhereNotIn and WhereNotIn methods --- contracts/database/orm/orm.go | 4 +++ database/gorm/query.go | 8 ++++++ database/gorm/query_test.go | 44 +++++++++++++++++++++++++++++++ mocks/database/orm/Query.go | 32 ++++++++++++++++++++++ mocks/database/orm/Transaction.go | 32 ++++++++++++++++++++++ 5 files changed, 120 insertions(+) diff --git a/contracts/database/orm/orm.go b/contracts/database/orm/orm.go index 37d8274f2..9179a415c 100644 --- a/contracts/database/orm/orm.go +++ b/contracts/database/orm/orm.go @@ -96,6 +96,8 @@ type Query interface { OrWhere(query any, args ...any) Query // OrWhereIn adds an "or where column in" clause to the query. OrWhereIn(column string, values []any) Query + // OrWhereNotIn adds an "or where column not in" clause to the query. + OrWhereNotIn(column string, values []any) Query // Paginate the given query into a simple paginator. Paginate(page, limit int, dest any, total *int64) error // Pluck retrieves a single column from the database. @@ -127,6 +129,8 @@ type Query interface { Where(query any, args ...any) Query // WhereIn adds a "where column in" clause to the query. WhereIn(column string, values []any) Query + // WhereNotIn adds a "where column not in" clause to the query. + WhereNotIn(column string, values []any) Query // WithoutEvents disables event firing for the query. WithoutEvents() Query // WithTrashed allows soft deleted models to be included in the results. diff --git a/database/gorm/query.go b/database/gorm/query.go index 5c8b12f04..5471b5018 100644 --- a/database/gorm/query.go +++ b/database/gorm/query.go @@ -672,6 +672,14 @@ func (r *QueryImpl) OrWhereIn(column string, values []any) ormcontract.Query { return r.OrWhere(fmt.Sprintf("%s IN ?", column), values) } +func (r *QueryImpl) WhereNotIn(column string, values []any) ormcontract.Query { + return r.Where(fmt.Sprintf("%s NOT IN ?", column), values) +} + +func (r *QueryImpl) OrWhereNotIn(column string, values []any) ormcontract.Query { + return r.OrWhere(fmt.Sprintf("%s NOT IN ?", column), values) +} + func (r *QueryImpl) WithoutEvents() ormcontract.Query { return NewQueryImplByInstance(r.instance, &QueryImpl{ config: r.config, diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 8143c979b..1c9dac7a7 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2743,6 +2743,50 @@ func (s *QueryTestSuite) TestOrWhereIn() { } } +func (s *QueryTestSuite) TestWhereNotIn() { + for driver, query := range s.queries { + s.Run(driver.String(), func() { + user := User{Name: "where_in_user", Avatar: "where_in_avatar"} + s.Nil(query.Create(&user)) + s.True(user.ID > 0) + + user1 := User{Name: "where_in_user_1", Avatar: "where_in_avatar_1"} + s.Nil(query.Create(&user1)) + s.True(user1.ID > 0) + + user2 := User{Name: "where_in_user_2", Avatar: "where_in_avatar_2"} + s.Nil(query.Create(&user2)) + s.True(user2.ID > 0) + + var users []User + s.Nil(query.WhereNotIn("id", []any{user.ID, user1.ID}).Find(&users)) + s.True(len(users) >= 1) + }) + } +} + +func (s *QueryTestSuite) TestOrWhereNotIn() { + for driver, query := range s.queries { + s.Run(driver.String(), func() { + user := User{Name: "where_in_user", Avatar: "where_in_avatar"} + s.Nil(query.Create(&user)) + s.True(user.ID > 0) + + user1 := User{Name: "where_in_user_1", Avatar: "where_in_avatar_1"} + s.Nil(query.Create(&user1)) + s.True(user1.ID > 0) + + user2 := User{Name: "where_in_user_2", Avatar: "where_in_avatar_2"} + s.Nil(query.Create(&user2)) + s.True(user2.ID > 0) + + var users []User + s.Nil(query.Where("id = ?", -1).OrWhereNotIn("id", []any{user.ID, user1.ID}).Find(&users)) + s.True(len(users) >= 1) + }) + } +} + func (s *QueryTestSuite) TestWithoutEvents() { for _, query := range s.queries { tests := []struct { diff --git a/mocks/database/orm/Query.go b/mocks/database/orm/Query.go index e7849ef71..52c5d4933 100644 --- a/mocks/database/orm/Query.go +++ b/mocks/database/orm/Query.go @@ -560,6 +560,22 @@ func (_m *Query) OrWhereIn(column string, values []interface{}) orm.Query { return r0 } +// OrWhereNotIn provides a mock function with given fields: column, values +func (_m *Query) OrWhereNotIn(column string, values []interface{}) orm.Query { + ret := _m.Called(column, values) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, []interface{}) orm.Query); ok { + r0 = rf(column, values) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // Order provides a mock function with given fields: value func (_m *Query) Order(value interface{}) orm.Query { ret := _m.Called(value) @@ -833,6 +849,22 @@ func (_m *Query) WhereIn(column string, values []interface{}) orm.Query { return r0 } +// WhereNotIn provides a mock function with given fields: column, values +func (_m *Query) WhereNotIn(column string, values []interface{}) orm.Query { + ret := _m.Called(column, values) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, []interface{}) orm.Query); ok { + r0 = rf(column, values) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // With provides a mock function with given fields: query, args func (_m *Query) With(query string, args ...interface{}) orm.Query { var _ca []interface{} diff --git a/mocks/database/orm/Transaction.go b/mocks/database/orm/Transaction.go index e97f1cb84..ac33dbe72 100644 --- a/mocks/database/orm/Transaction.go +++ b/mocks/database/orm/Transaction.go @@ -574,6 +574,22 @@ func (_m *Transaction) OrWhereIn(column string, values []interface{}) orm.Query return r0 } +// OrWhereNotIn provides a mock function with given fields: column, values +func (_m *Transaction) OrWhereNotIn(column string, values []interface{}) orm.Query { + ret := _m.Called(column, values) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, []interface{}) orm.Query); ok { + r0 = rf(column, values) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // Order provides a mock function with given fields: value func (_m *Transaction) Order(value interface{}) orm.Query { ret := _m.Called(value) @@ -861,6 +877,22 @@ func (_m *Transaction) WhereIn(column string, values []interface{}) orm.Query { return r0 } +// WhereNotIn provides a mock function with given fields: column, values +func (_m *Transaction) WhereNotIn(column string, values []interface{}) orm.Query { + ret := _m.Called(column, values) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, []interface{}) orm.Query); ok { + r0 = rf(column, values) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // With provides a mock function with given fields: query, args func (_m *Transaction) With(query string, args ...interface{}) orm.Query { var _ca []interface{} From 999cca5c291f6b0875e170da6bd68d58db46f0a3 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sun, 28 Jan 2024 20:34:51 +0330 Subject: [PATCH 2/4] update: update TestWhereNotIn method --- database/gorm/query_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 1c9dac7a7..30504809f 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2758,9 +2758,9 @@ func (s *QueryTestSuite) TestWhereNotIn() { s.Nil(query.Create(&user2)) s.True(user2.ID > 0) - var users []User - s.Nil(query.WhereNotIn("id", []any{user.ID, user1.ID}).Find(&users)) - s.True(len(users) >= 1) + var user3 User + s.Nil(query.Where("id = ?", user2.ID).WhereNotIn("id", []any{user.ID, user1.ID}).First(&user3)) + s.True(user3.ID == user2.ID) }) } } From 174ab5c127ff6ed6e1144dc4744903933b3464e0 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Sun, 28 Jan 2024 21:12:01 +0330 Subject: [PATCH 3/4] update: update TestOrWhereNotIn method --- database/gorm/query_test.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 30504809f..83f62e93f 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2776,13 +2776,9 @@ func (s *QueryTestSuite) TestOrWhereNotIn() { s.Nil(query.Create(&user1)) s.True(user1.ID > 0) - user2 := User{Name: "where_in_user_2", Avatar: "where_in_avatar_2"} - s.Nil(query.Create(&user2)) - s.True(user2.ID > 0) - var users []User s.Nil(query.Where("id = ?", -1).OrWhereNotIn("id", []any{user.ID, user1.ID}).Find(&users)) - s.True(len(users) >= 1) + s.True(len(users) >= 0) }) } } From fa39dc73e5756ca060e5f951e81b648fb3abb7a8 Mon Sep 17 00:00:00 2001 From: kamandlou Date: Mon, 29 Jan 2024 21:34:52 +0330 Subject: [PATCH 4/4] check users contain user2 --- database/gorm/query_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 83f62e93f..d349e983f 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2776,9 +2776,19 @@ func (s *QueryTestSuite) TestOrWhereNotIn() { s.Nil(query.Create(&user1)) s.True(user1.ID > 0) + user2 := User{Name: "where_in_user_2", Avatar: "where_in_avatar_2"} + s.Nil(query.Create(&user2)) + s.True(user2.ID > 0) + var users []User s.Nil(query.Where("id = ?", -1).OrWhereNotIn("id", []any{user.ID, user1.ID}).Find(&users)) - s.True(len(users) >= 0) + var user2Found bool + for _, user := range users { + if user.ID == user2.ID { + user2Found = true + } + } + s.True(user2Found) }) } }