174 lines
3.9 KiB
Go
174 lines
3.9 KiB
Go
package dbr
|
|
|
|
import "context"
|
|
|
|
type SelectBuilder struct {
|
|
runner
|
|
EventReceiver
|
|
Dialect Dialect
|
|
|
|
*SelectStmt
|
|
}
|
|
|
|
func prepareSelect(a []string) []interface{} {
|
|
b := make([]interface{}, len(a))
|
|
for i := range a {
|
|
b[i] = a[i]
|
|
}
|
|
return b
|
|
}
|
|
|
|
func (sess *Session) Select(column ...string) *SelectBuilder {
|
|
return &SelectBuilder{
|
|
runner: sess,
|
|
EventReceiver: sess,
|
|
Dialect: sess.Dialect,
|
|
SelectStmt: Select(prepareSelect(column)...),
|
|
}
|
|
}
|
|
|
|
func (tx *Tx) Select(column ...string) *SelectBuilder {
|
|
return &SelectBuilder{
|
|
runner: tx,
|
|
EventReceiver: tx,
|
|
Dialect: tx.Dialect,
|
|
SelectStmt: Select(prepareSelect(column)...),
|
|
}
|
|
}
|
|
|
|
func (sess *Session) SelectBySql(query string, value ...interface{}) *SelectBuilder {
|
|
return &SelectBuilder{
|
|
runner: sess,
|
|
EventReceiver: sess,
|
|
Dialect: sess.Dialect,
|
|
SelectStmt: SelectBySql(query, value...),
|
|
}
|
|
}
|
|
|
|
func (tx *Tx) SelectBySql(query string, value ...interface{}) *SelectBuilder {
|
|
return &SelectBuilder{
|
|
runner: tx,
|
|
EventReceiver: tx,
|
|
Dialect: tx.Dialect,
|
|
SelectStmt: SelectBySql(query, value...),
|
|
}
|
|
}
|
|
|
|
// DEPRECATED: use LoadOne instead
|
|
func (b *SelectBuilder) LoadStruct(value interface{}) error {
|
|
return b.LoadOne(value)
|
|
}
|
|
|
|
// DEPRECATED: use Load instead
|
|
func (b *SelectBuilder) LoadStructs(value interface{}) (int, error) {
|
|
return b.Load(value)
|
|
}
|
|
|
|
// DEPRECATED: use LoadOne instead
|
|
func (b *SelectBuilder) LoadValue(value interface{}) error {
|
|
return b.LoadOne(value)
|
|
}
|
|
|
|
// DEPRECATED: use Load instead
|
|
func (b *SelectBuilder) LoadValues(value interface{}) (int, error) {
|
|
return b.Load(value)
|
|
}
|
|
|
|
func (b *SelectBuilder) LoadOneContext(ctx context.Context, value interface{}) error {
|
|
count, err := query(ctx, b.runner, b.EventReceiver, b, b.Dialect, value)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if count == 0 {
|
|
return ErrNotFound
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (b *SelectBuilder) LoadOne(value interface{}) error {
|
|
return b.LoadOneContext(context.Background(), value)
|
|
}
|
|
|
|
func (b *SelectBuilder) LoadContext(ctx context.Context, value interface{}) (int, error) {
|
|
return query(ctx, b.runner, b.EventReceiver, b, b.Dialect, value)
|
|
}
|
|
|
|
func (b *SelectBuilder) Load(value interface{}) (int, error) {
|
|
return b.LoadContext(context.Background(), value)
|
|
}
|
|
|
|
func (b *SelectBuilder) Join(table, on interface{}) *SelectBuilder {
|
|
b.SelectStmt.Join(table, on)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) LeftJoin(table, on interface{}) *SelectBuilder {
|
|
b.SelectStmt.LeftJoin(table, on)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) RightJoin(table, on interface{}) *SelectBuilder {
|
|
b.SelectStmt.RightJoin(table, on)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) FullJoin(table, on interface{}) *SelectBuilder {
|
|
b.SelectStmt.FullJoin(table, on)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Distinct() *SelectBuilder {
|
|
b.SelectStmt.Distinct()
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) From(table interface{}) *SelectBuilder {
|
|
b.SelectStmt.From(table)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) GroupBy(col ...string) *SelectBuilder {
|
|
b.SelectStmt.GroupBy(col...)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Having(query interface{}, value ...interface{}) *SelectBuilder {
|
|
b.SelectStmt.Having(query, value...)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Limit(n uint64) *SelectBuilder {
|
|
b.SelectStmt.Limit(n)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Offset(n uint64) *SelectBuilder {
|
|
b.SelectStmt.Offset(n)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) OrderDir(col string, isAsc bool) *SelectBuilder {
|
|
if isAsc {
|
|
b.SelectStmt.OrderAsc(col)
|
|
} else {
|
|
b.SelectStmt.OrderDesc(col)
|
|
}
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Paginate(page, perPage uint64) *SelectBuilder {
|
|
b.Limit(perPage)
|
|
b.Offset((page - 1) * perPage)
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) OrderBy(col string) *SelectBuilder {
|
|
b.SelectStmt.Order = append(b.SelectStmt.Order, Expr(col))
|
|
return b
|
|
}
|
|
|
|
func (b *SelectBuilder) Where(query interface{}, value ...interface{}) *SelectBuilder {
|
|
b.SelectStmt.Where(query, value...)
|
|
return b
|
|
}
|