Skip to content

Commit

Permalink
feat: add SelectQuery.Exists helper
Browse files Browse the repository at this point in the history
  • Loading branch information
vmihailenco committed Sep 13, 2021
1 parent 0647e63 commit c3e59c1
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 1 deletion.
13 changes: 13 additions & 0 deletions internal/dbtest/db_test.go
Expand Up @@ -224,6 +224,7 @@ func TestDB(t *testing.T) {
{testInterfaceJSON},
{testScanBytes},
{testPointers},
{testExists},
}

testEachDB(t, func(t *testing.T, dbName string, db *bun.DB) {
Expand Down Expand Up @@ -873,3 +874,15 @@ func testPointers(t *testing.T, db *bun.DB) {
err = db.NewSelect().Model(&models2).Order("id ASC").Scan(ctx)
require.NoError(t, err)
}

func testExists(t *testing.T, db *bun.DB) {
ctx := context.Background()

exists, err := db.NewSelect().ColumnExpr("1").Exists(ctx)
require.NoError(t, err)
require.True(t, exists)

exists, err = db.NewSelect().ColumnExpr("1").Where("1 = 0").Exists(ctx)
require.NoError(t, err)
require.False(t, exists)
}
40 changes: 39 additions & 1 deletion query_select.go
Expand Up @@ -738,7 +738,7 @@ func (q *SelectQuery) afterSelectHook(ctx context.Context) error {
func (q *SelectQuery) Count(ctx context.Context) (int, error) {
qq := countQuery{q}

queryBytes, err := qq.appendQuery(q.db.fmter, nil, true)
queryBytes, err := qq.AppendQuery(q.db.fmter, nil)
if err != nil {
return 0, err
}
Expand Down Expand Up @@ -794,6 +794,25 @@ func (q *SelectQuery) ScanAndCount(ctx context.Context, dest ...interface{}) (in
return count, firstErr
}

func (q *SelectQuery) Exists(ctx context.Context) (bool, error) {
qq := existsQuery{q}

queryBytes, err := qq.AppendQuery(q.db.fmter, nil)
if err != nil {
return false, err
}

query := internal.String(queryBytes)
ctx, event := q.db.beforeQuery(ctx, qq, query, nil)

var exists bool
err = q.conn.QueryRowContext(ctx, query).Scan(&exists)

q.db.afterQuery(ctx, event, nil, err)

return exists, err
}

//------------------------------------------------------------------------------

type joinQuery struct {
Expand Down Expand Up @@ -837,3 +856,22 @@ type countQuery struct {
func (q countQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
return q.appendQuery(fmter, b, true)
}

//------------------------------------------------------------------------------

type existsQuery struct {
*SelectQuery
}

func (q existsQuery) AppendQuery(fmter schema.Formatter, b []byte) (_ []byte, err error) {
b = append(b, "SELECT EXISTS ("...)

b, err = q.appendQuery(fmter, b, false)
if err != nil {
return nil, err
}

b = append(b, ")"...)

return b, nil
}

0 comments on commit c3e59c1

Please sign in to comment.