Make Count works

This commit is contained in:
Jinzhu 2013-10-27 20:07:13 +08:00
parent f892a52cad
commit ec49f57394
3 changed files with 35 additions and 5 deletions

View File

@ -45,6 +45,7 @@ func (s *Chain) do(value interface{}) *Do {
do.offsetStr = s.offsetStr do.offsetStr = s.offsetStr
do.limitStr = s.limitStr do.limitStr = s.limitStr
s.value = value
do.setModel(value) do.setModel(value)
return &do return &do
} }
@ -101,8 +102,9 @@ func (s *Chain) Order(value string, reorder ...bool) *Chain {
return s return s
} }
func (s *Chain) Count() int64 { func (s *Chain) Count(value interface{}) *Chain {
return 0 s.Select("count(*)").do(s.value).count(value)
return s
} }
func (s *Chain) Select(value interface{}) *Chain { func (s *Chain) Select(value interface{}) *Chain {

14
do.go
View File

@ -208,6 +208,20 @@ func (s *Do) query() {
} }
} }
func (s *Do) count(value interface{}) {
dest_out := reflect.Indirect(reflect.ValueOf(value))
s.prepareQuerySql()
rows, err := s.db.Query(s.Sql, s.SqlVars...)
s.err(err)
for rows.Next() {
var dest int64
s.err(rows.Scan(&dest))
dest_out.Set(reflect.ValueOf(dest))
}
return
}
func (s *Do) pluck(value interface{}) *Do { func (s *Do) pluck(value interface{}) *Do {
dest_out := reflect.Indirect(reflect.ValueOf(value)) dest_out := reflect.Indirect(reflect.ValueOf(value))
dest_type := dest_out.Type().Elem() dest_type := dest_out.Type().Elem()

View File

@ -63,8 +63,8 @@ func init() {
} }
func TestFirst(t *testing.T) { func TestFirst(t *testing.T) {
// var u1, u2 User var u1, u2 User
// db.Where("name = ?", "3").Order("age desc").First(&u1).First(&u2) db.Where("name = ?", "3").Order("age desc").First(&u1).First(&u2)
} }
func TestSaveAndFind(t *testing.T) { func TestSaveAndFind(t *testing.T) {
@ -302,7 +302,7 @@ func TestOffset(t *testing.T) {
} }
} }
func TestOrAndNot(t *testing.T) { func TestOr(t *testing.T) {
var users []User var users []User
db.Where("name = ?", "1").Or("name = ?", "3").Find(&users) db.Where("name = ?", "1").Or("name = ?", "3").Find(&users)
if len(users) != 3 { if len(users) != 3 {
@ -310,6 +310,20 @@ func TestOrAndNot(t *testing.T) {
} }
} }
func TestCount(t *testing.T) {
var count, count1, count2 int64
var users []User
db.Where("name = ?", "1").Or("name = ?", "3").Find(&users).Count(&count)
if count != int64(len(users)) {
t.Errorf("Count() method should get same value of users count")
}
db.Model(&User{}).Where("name = ?", "1").Count(&count1).Or("name = ?", "3").Count(&count2)
if !(count1 == 1 && count2 == 3) {
t.Errorf("Multiple count should works well also")
}
}
func TestCreatedAtAndUpdatedAt(t *testing.T) { func TestCreatedAtAndUpdatedAt(t *testing.T) {
name := "check_created_at_and_updated_at" name := "check_created_at_and_updated_at"
u := User{Name: name, Age: 1} u := User{Name: name, Age: 1}