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 }