168 lines
4.0 KiB
Go
168 lines
4.0 KiB
Go
package pgm
|
|
|
|
import "strings"
|
|
|
|
// Field related to a table
|
|
type Field string
|
|
|
|
func (f Field) Name() string {
|
|
return strings.Split(string(f), ".")[1]
|
|
}
|
|
|
|
func (f Field) String() string {
|
|
return string(f)
|
|
}
|
|
|
|
// Count fn wrapping of field
|
|
func (f Field) Count() Field {
|
|
return Field("COUNT(" + f.String() + ")")
|
|
}
|
|
|
|
// StringEscape will return a empty string for null value
|
|
func (f Field) StringEscape() Field {
|
|
return Field("COALESCE(" + f.String() + ", '')")
|
|
}
|
|
|
|
// NumberEscape will return a zero string for null value
|
|
func (f Field) NumberEscape() Field {
|
|
return Field("COALESCE(" + f.String() + ", 0)")
|
|
}
|
|
|
|
// BooleanEscape will return a false for null value
|
|
func (f Field) BooleanEscape() Field {
|
|
return Field("COALESCE(" + f.String() + ", FALSE)")
|
|
}
|
|
|
|
// Avg fn wrapping of field
|
|
func (f Field) Avg() Field {
|
|
return Field("AVG(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Sum() Field {
|
|
return Field("SUM(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Max() Field {
|
|
return Field("MAX(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Min() Field {
|
|
return Field("Min(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Lower() Field {
|
|
return Field("LOWER(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Upper() Field {
|
|
return Field("UPPER(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Trim() Field {
|
|
return Field("TRIM(" + f.String() + ")")
|
|
}
|
|
|
|
func (f Field) Asc() Field {
|
|
return Field(f.String() + " ASC")
|
|
}
|
|
|
|
func (f Field) Desc() Field {
|
|
return Field(f.String() + " DESC")
|
|
}
|
|
|
|
func (f Field) IsNull() Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, op: " IS NULL", len: len(col) + 8}
|
|
}
|
|
|
|
func (f Field) IsNotNull() Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, op: " IS NOT NULL", len: len(col) + 12}
|
|
}
|
|
|
|
// EqualFold will use LOWER(column_name) = LOWER(val) for comparision
|
|
func (f Field) EqFold(val string) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: "LOWER(" + col + ")", Val: val, op: " = LOWER($", action: CondActionNeedToClose, len: len(col) + 5}
|
|
}
|
|
|
|
// Eq is equal
|
|
func (f Field) Eq(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " = $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) NotEq(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " != $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) Gt(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " > $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) Lt(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " < $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) Gte(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " >= $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) Lte(val any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " <= $", len: len(col) + 5}
|
|
}
|
|
|
|
func (f Field) Like(val string) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " LIKE $", len: len(f.String()) + 5}
|
|
}
|
|
|
|
func (f Field) LikeFold(val string) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: "LOWER(" + col + ")", Val: val, op: " LIKE LOWER($", action: CondActionNeedToClose, len: len(col) + 5}
|
|
}
|
|
|
|
// ILIKE is case-insensitive
|
|
func (f Field) ILike(val string) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " ILIKE $", len: len(col) + 5}
|
|
}
|
|
|
|
// In using ANY
|
|
func (f Field) In(val ...any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " = ANY($", action: CondActionNeedToClose, len: len(col) + 5}
|
|
}
|
|
|
|
// NotIn using ANY
|
|
func (f Field) NotIn(val ...any) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: val, op: " != ANY($", action: CondActionNeedToClose, len: len(col) + 5}
|
|
}
|
|
|
|
// NotInSubQuery using ANY
|
|
func (f Field) NotInSubQuery(qry WhereClause) Conditioner {
|
|
col := f.String()
|
|
return &Cond{Field: col, Val: qry, op: " != ANY($)", action: CondActionSubQuery}
|
|
}
|
|
|
|
func joinFileds(fields []Field) string {
|
|
sb := getSB()
|
|
defer putSB(sb)
|
|
for i, f := range fields {
|
|
if i == 0 {
|
|
sb.WriteString(f.String())
|
|
} else {
|
|
sb.WriteString(", ")
|
|
sb.WriteString(f.String())
|
|
}
|
|
}
|
|
|
|
return sb.String()
|
|
}
|