github.com/artisanhe/tools@v1.0.1-0.20210607022958-19a8fef2eb04/sqlx/builder/stmt_select.go (about)

     1  package builder
     2  
     3  import (
     4  	"fmt"
     5  )
     6  
     7  func SelectFrom(table *Table) *StmtSelect {
     8  	return &StmtSelect{
     9  		table: table,
    10  	}
    11  }
    12  
    13  type StmtSelect struct {
    14  	table     *Table
    15  	expr      CanExpr
    16  	modifiers []string
    17  	*where
    18  	*groupBy
    19  	*orderBy
    20  	*limit
    21  	forUpdate bool
    22  	comment   string
    23  }
    24  
    25  func (s StmtSelect) Comment(comment string) *StmtSelect {
    26  	s.comment = comment
    27  	return &s
    28  }
    29  
    30  func (s *StmtSelect) Type() StmtType {
    31  	return STMT_SELECT
    32  }
    33  
    34  func (s StmtSelect) For(expr CanExpr) *StmtSelect {
    35  	s.expr = expr
    36  	return &s
    37  }
    38  
    39  func (s StmtSelect) Modifier(modifiers ...string) *StmtSelect {
    40  	s.modifiers = append(s.modifiers, modifiers...)
    41  	return &s
    42  }
    43  
    44  func (s StmtSelect) ForUpdate() *StmtSelect {
    45  	s.forUpdate = true
    46  	return &s
    47  }
    48  
    49  func (s StmtSelect) Where(cond *Condition) *StmtSelect {
    50  	s.where = (*where)(cond)
    51  	return &s
    52  }
    53  
    54  func (s StmtSelect) GroupBy(canExpr CanExpr) *StmtSelect {
    55  	if s.groupBy == nil {
    56  		s.groupBy = &groupBy{}
    57  	}
    58  	s.groupBy = s.groupBy.addBy(canExpr, "")
    59  	return &s
    60  }
    61  
    62  func (s StmtSelect) GroupAscBy(canExpr CanExpr) *StmtSelect {
    63  	if s.groupBy == nil {
    64  		s.groupBy = &groupBy{}
    65  	}
    66  	s.groupBy = s.groupBy.addBy(canExpr, ORDER_ASC)
    67  	return &s
    68  }
    69  
    70  func (s StmtSelect) GroupDescBy(canExpr CanExpr) *StmtSelect {
    71  	if s.groupBy == nil {
    72  		s.groupBy = &groupBy{}
    73  	}
    74  	s.groupBy = s.groupBy.addBy(canExpr, ORDER_DESC)
    75  	return &s
    76  }
    77  
    78  func (s StmtSelect) WithRollup() *StmtSelect {
    79  	s.groupBy = s.groupBy.rollup()
    80  	return &s
    81  }
    82  
    83  func (s StmtSelect) Having(cond *Condition) *StmtSelect {
    84  	if s.groupBy == nil {
    85  		s.groupBy = &groupBy{}
    86  	}
    87  	s.groupBy = s.groupBy.having(cond)
    88  	return &s
    89  }
    90  
    91  func (s StmtSelect) OrderBy(canExpr CanExpr, orderType OrderType) *StmtSelect {
    92  	if s.orderBy == nil {
    93  		s.orderBy = &orderBy{}
    94  	}
    95  	s.orderBy = s.orderBy.addBy(canExpr, orderType)
    96  	return &s
    97  }
    98  
    99  func (s StmtSelect) OrderAscBy(canExpr CanExpr) *StmtSelect {
   100  	return s.OrderBy(canExpr, ORDER_ASC)
   101  }
   102  
   103  func (s StmtSelect) OrderDescBy(canExpr CanExpr) *StmtSelect {
   104  	return s.OrderBy(canExpr, ORDER_DESC)
   105  }
   106  
   107  func (s StmtSelect) Limit(size int32) *StmtSelect {
   108  	if s.limit == nil {
   109  		s.limit = &limit{}
   110  	}
   111  	s.limit = s.limit.limit(size)
   112  	return &s
   113  }
   114  
   115  func (s StmtSelect) Offset(offset int32) *StmtSelect {
   116  	if s.limit == nil {
   117  		s.limit = &limit{}
   118  	}
   119  	s.limit = s.limit.offset(offset)
   120  	return &s
   121  }
   122  
   123  func (s *StmtSelect) Expr() *Expression {
   124  	selectExpr := Expr("*")
   125  	if s.expr != nil {
   126  		selectExpr = s.expr.Expr()
   127  	}
   128  
   129  	expr := Expr(
   130  		fmt.Sprintf("%s %s FROM %s", statement(s.comment, "SELECT", s.modifiers...), selectExpr.Query, s.table.FullName()),
   131  		selectExpr.Args...,
   132  	)
   133  
   134  	expr = expr.ConcatBy(" ", s.where)
   135  	expr = expr.ConcatBy(" ", s.groupBy)
   136  	expr = expr.ConcatBy(" ", s.orderBy)
   137  	expr = expr.ConcatBy(" ", s.limit)
   138  
   139  	if s.forUpdate {
   140  		expr = expr.ConcatBy(" ", Expr("FOR UPDATE"))
   141  	}
   142  
   143  	return expr
   144  }