From c052d15bda2ca00e06e53bd5c4335146d485deab Mon Sep 17 00:00:00 2001 From: rainingmaster <312841925@qq.com> Date: Sun, 30 Aug 2020 11:43:19 +0800 Subject: [PATCH] feature: using default limite and offset query for count --- clause/limit.go | 4 ++++ finisher_api.go | 3 +++ tests/count_test.go | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/clause/limit.go b/clause/limit.go index 1946820d..7e00b2bf 100644 --- a/clause/limit.go +++ b/clause/limit.go @@ -6,6 +6,7 @@ import "strconv" type Limit struct { Limit int Offset int + Ignore bool } // Name where clause name @@ -15,6 +16,9 @@ func (limit Limit) Name() string { // Build build where clause func (limit Limit) Build(builder Builder) { + if limit.Ignore { + return + } if limit.Limit > 0 { builder.WriteString("LIMIT ") builder.WriteString(strconv.Itoa(limit.Limit)) diff --git a/finisher_api.go b/finisher_api.go index a205b859..18e6d056 100644 --- a/finisher_api.go +++ b/finisher_api.go @@ -322,6 +322,9 @@ func (db *DB) Count(count *int64) (tx *DB) { defer tx.Statement.AddClause(clause.Select{}) } + tx.Statement.AddClause(clause.Limit{Ignore: true}) + defer tx.Statement.AddClause(clause.Limit{Ignore: false}) + tx.Statement.Dest = count tx.callbacks.Query().Execute(tx) if tx.RowsAffected != 1 { diff --git a/tests/count_test.go b/tests/count_test.go index 216fa3a1..b8d03820 100644 --- a/tests/count_test.go +++ b/tests/count_test.go @@ -72,4 +72,10 @@ func TestCount(t *testing.T) { if err := DB.Debug().Table("users").Joins("LEFT JOIN companies on companies.name = users.name").Where("users.name = ?", user1.Name).Count(&count4).Error; err != nil || count4 != 1 { t.Errorf("count with join, got error: %v, count %v", err, count) } + + var count5 int64 + DB.Where("name in ?", []string{user2.Name, user3.Name}).Limit(1).Offset(1).Find(&users).Count(&count5) + if len(users) != 1 || count5 != 2 { + t.Errorf("count for pagination should works") + } }