From d7542e87ae2a8a4f9c6d6de2e061f15f07b7eeac Mon Sep 17 00:00:00 2001 From: Jack Date: Tue, 10 Nov 2020 10:37:42 +0800 Subject: [PATCH] improve gdb.Model.Count --- database/gdb/gdb_model_delete.go | 2 +- database/gdb/gdb_model_select.go | 4 ++-- database/gdb/gdb_model_update.go | 2 +- database/gdb/gdb_model_utility.go | 26 +++++++++++++++----------- database/gdb/gdb_z_mysql_model_test.go | 6 ++++++ 5 files changed, 25 insertions(+), 15 deletions(-) diff --git a/database/gdb/gdb_model_delete.go b/database/gdb/gdb_model_delete.go index 7c0ea400b..18b75005d 100644 --- a/database/gdb/gdb_model_delete.go +++ b/database/gdb/gdb_model_delete.go @@ -28,7 +28,7 @@ func (m *Model) Delete(where ...interface{}) (result sql.Result, err error) { }() var ( fieldNameDelete = m.getSoftFieldNameDeleted() - conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false) + conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false, false) ) // Soft deleting. if !m.unscoped && fieldNameDelete != "" { diff --git a/database/gdb/gdb_model_select.go b/database/gdb/gdb_model_select.go index 99338de83..e340dac35 100644 --- a/database/gdb/gdb_model_select.go +++ b/database/gdb/gdb_model_select.go @@ -46,7 +46,7 @@ func (m *Model) doGetAll(limit1 bool, where ...interface{}) (Result, error) { } var ( softDeletingCondition = m.getConditionForSoftDeleting() - conditionWhere, conditionExtra, conditionArgs = m.formatCondition(limit1) + conditionWhere, conditionExtra, conditionArgs = m.formatCondition(limit1, false) ) if !m.unscoped && softDeletingCondition != "" { if conditionWhere == "" { @@ -344,7 +344,7 @@ func (m *Model) Count(where ...interface{}) (int, error) { } var ( softDeletingCondition = m.getConditionForSoftDeleting() - conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false) + conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false, true) ) if !m.unscoped && softDeletingCondition != "" { if conditionWhere == "" { diff --git a/database/gdb/gdb_model_update.go b/database/gdb/gdb_model_update.go index 32fdebc3a..7e38b4e90 100644 --- a/database/gdb/gdb_model_update.go +++ b/database/gdb/gdb_model_update.go @@ -46,7 +46,7 @@ func (m *Model) Update(dataAndWhere ...interface{}) (result sql.Result, err erro fieldNameCreate = m.getSoftFieldNameCreated() fieldNameUpdate = m.getSoftFieldNameUpdated() fieldNameDelete = m.getSoftFieldNameDeleted() - conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false) + conditionWhere, conditionExtra, conditionArgs = m.formatCondition(false, false) ) // Automatically update the record updating time. if !m.unscoped && fieldNameUpdate != "" { diff --git a/database/gdb/gdb_model_utility.go b/database/gdb/gdb_model_utility.go index 89b02e544..c5ca529cf 100644 --- a/database/gdb/gdb_model_utility.go +++ b/database/gdb/gdb_model_utility.go @@ -192,7 +192,7 @@ func (m *Model) getPrimaryKey() string { // Note that this function does not change any attribute value of the . // // The parameter specifies whether limits querying only one record if m.limit is not set. -func (m *Model) formatCondition(limit1 bool) (conditionWhere string, conditionExtra string, conditionArgs []interface{}) { +func (m *Model) formatCondition(limit1 bool, isCountStatement bool) (conditionWhere string, conditionExtra string, conditionArgs []interface{}) { if len(m.whereHolder) > 0 { for _, v := range m.whereHolder { switch v.operator { @@ -259,18 +259,22 @@ func (m *Model) formatCondition(limit1 bool) (conditionWhere string, conditionEx conditionArgs = append(conditionArgs, havingArgs...) } } - if m.limit != 0 { - if m.start >= 0 { - conditionExtra += fmt.Sprintf(" LIMIT %d,%d", m.start, m.limit) - } else { - conditionExtra += fmt.Sprintf(" LIMIT %d", m.limit) + if !isCountStatement { + if m.limit != 0 { + if m.start >= 0 { + conditionExtra += fmt.Sprintf(" LIMIT %d,%d", m.start, m.limit) + } else { + conditionExtra += fmt.Sprintf(" LIMIT %d", m.limit) + } + } else if limit1 { + conditionExtra += " LIMIT 1" + } + + if m.offset >= 0 { + conditionExtra += fmt.Sprintf(" OFFSET %d", m.offset) } - } else if limit1 { - conditionExtra += " LIMIT 1" - } - if m.offset >= 0 { - conditionExtra += fmt.Sprintf(" OFFSET %d", m.offset) } + if m.lockInfo != "" { conditionExtra += " " + m.lockInfo } diff --git a/database/gdb/gdb_z_mysql_model_test.go b/database/gdb/gdb_z_mysql_model_test.go index 0c06a6535..95870ad75 100644 --- a/database/gdb/gdb_z_mysql_model_test.go +++ b/database/gdb/gdb_z_mysql_model_test.go @@ -775,6 +775,12 @@ func Test_Model_Count(t *testing.T) { t.Assert(err, nil) t.Assert(count, 2) }) + // COUNT...LIMIT... + gtest.C(t, func(t *gtest.T) { + count, err := db.Table(table).Page(1, 2).Count() + t.Assert(err, nil) + t.Assert(count, SIZE) + }) //gtest.C(t, func(t *gtest.T) { // count, err := db.Table(table).Fields("id myid").Where("id>8").Count() // t.Assert(err, nil)