Skip to content

Commit

Permalink
add Count method
Browse files Browse the repository at this point in the history
  • Loading branch information
hwbrzzl committed Mar 3, 2025
1 parent 2566fb1 commit baad3ed
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 7 deletions.
2 changes: 1 addition & 1 deletion contracts/database/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ type DB interface {

type Query interface {
// commit
// Count(dest *int64) error
Count() (int64, error)
// Chunk(size int, callback func(rows []any) error) error
// CrossJoin(table string, on any, args ...any) Query
// DoesntExist() (bool, error)
Expand Down
30 changes: 24 additions & 6 deletions database/db/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import (
"github.com/goravel/framework/contracts/database/db"
"github.com/goravel/framework/contracts/database/driver"
"github.com/goravel/framework/contracts/database/logger"
"github.com/goravel/framework/contracts/database/schema"
"github.com/goravel/framework/errors"
"github.com/goravel/framework/support/carbon"
"github.com/goravel/framework/support/str"
Expand All @@ -26,7 +25,6 @@ type Query struct {
ctx context.Context
err error
driver driver.Driver
grammar schema.Grammar
logger logger.Logger
single bool
}
Expand All @@ -37,10 +35,9 @@ func NewQuery(ctx context.Context, driver driver.Driver, builder db.Builder, log
conditions: Conditions{
Table: table,
},
ctx: ctx,
driver: driver,
grammar: driver.Grammar(),
logger: logger,
ctx: ctx,
driver: driver,
logger: logger,
}
}

Expand All @@ -51,6 +48,27 @@ func NewSingleQuery(ctx context.Context, driver driver.Driver, builder db.Builde
return query
}

func (r *Query) Count() (int64, error) {
r.conditions.Selects = []string{"COUNT(*)"}

sql, args, err := r.buildSelect()
if err != nil {
return 0, err
}

var count int64
err = r.builder.Get(&count, sql, args...)
if err != nil {
r.trace(sql, args, -1, err)

return 0, err
}

r.trace(sql, args, -1, nil)

return count, nil
}

func (r *Query) Delete() (*db.Result, error) {
sql, args, err := r.buildDelete()
if err != nil {
Expand Down
16 changes: 16 additions & 0 deletions database/db/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,22 @@ func (s *QueryTestSuite) SetupTest() {
s.query = NewQuery(s.ctx, s.mockDriver, s.mockBuilder, s.mockLogger, "users")
}

func (s *QueryTestSuite) TestCount() {
var count int64

s.mockDriver.EXPECT().Config().Return(database.Config{}).Once()
s.mockBuilder.EXPECT().Get(&count, "SELECT COUNT(*) FROM users WHERE name = ?", "John").Run(func(dest any, query string, args ...any) {
destCount := dest.(*int64)
*destCount = 1
}).Return(nil).Once()
s.mockDriver.EXPECT().Explain("SELECT COUNT(*) FROM users WHERE name = ?", "John").Return("SELECT COUNT(*) FROM users WHERE name = \"John\"").Once()
s.mockLogger.EXPECT().Trace(s.ctx, s.now, "SELECT COUNT(*) FROM users WHERE name = \"John\"", int64(-1), nil).Return().Once()

count, err := s.query.Where("name", "John").Count()
s.NoError(err)
s.Equal(int64(1), count)
}

func (s *QueryTestSuite) TestDelete() {
s.Run("success", func() {
mockResult := &MockResult{}
Expand Down
14 changes: 14 additions & 0 deletions tests/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,20 @@ func (s *DBTestSuite) TearDownSuite() {
}
}

func (s *DBTestSuite) TestCount() {
for driver, query := range s.queries {
s.Run(driver, func() {
query.DB().Table("products").Insert([]Product{
{Name: "count_product1"},
{Name: "count_product2"},
})
count, err := query.DB().Table("products").Count()
s.NoError(err)
s.Equal(int64(2), count)
})
}
}

func (s *DBTestSuite) TestExists() {
for driver, query := range s.queries {
s.Run(driver, func() {
Expand Down

0 comments on commit baad3ed

Please sign in to comment.