2020-01-30 10:14:48 +03:00
|
|
|
package clause
|
|
|
|
|
2020-02-07 18:45:35 +03:00
|
|
|
import "strings"
|
2020-02-05 06:14:58 +03:00
|
|
|
|
2020-01-30 10:14:48 +03:00
|
|
|
// Expression expression interface
|
|
|
|
type Expression interface {
|
|
|
|
Build(builder Builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// NegationExpressionBuilder negation expression builder
|
|
|
|
type NegationExpressionBuilder interface {
|
|
|
|
NegationBuild(builder Builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Expr raw expression
|
|
|
|
type Expr struct {
|
2020-02-07 18:45:35 +03:00
|
|
|
SQL string
|
|
|
|
Vars []interface{}
|
2020-01-30 10:14:48 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
// Build build raw expression
|
|
|
|
func (expr Expr) Build(builder Builder) {
|
2020-02-07 18:45:35 +03:00
|
|
|
sql := expr.SQL
|
|
|
|
for _, v := range expr.Vars {
|
2020-02-22 06:15:51 +03:00
|
|
|
sql = strings.Replace(sql, " ?", " "+builder.AddVar(v), 1)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
builder.Write(sql)
|
|
|
|
}
|
|
|
|
|
|
|
|
// IN Whether a value is within a set of values
|
|
|
|
type IN struct {
|
|
|
|
Column interface{}
|
|
|
|
Values []interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (in IN) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(in.Column)
|
|
|
|
|
|
|
|
switch len(in.Values) {
|
|
|
|
case 0:
|
|
|
|
builder.Write(" IN (NULL)")
|
|
|
|
case 1:
|
|
|
|
builder.Write(" = ", builder.AddVar(in.Values...))
|
|
|
|
default:
|
|
|
|
builder.Write(" IN (", builder.AddVar(in.Values...), ")")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (in IN) NegationBuild(builder Builder) {
|
|
|
|
switch len(in.Values) {
|
|
|
|
case 0:
|
|
|
|
case 1:
|
|
|
|
builder.Write(" <> ", builder.AddVar(in.Values...))
|
|
|
|
default:
|
|
|
|
builder.Write(" NOT IN (", builder.AddVar(in.Values...), ")")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Eq equal to for where
|
|
|
|
type Eq struct {
|
|
|
|
Column interface{}
|
|
|
|
Value interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (eq Eq) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(eq.Column)
|
|
|
|
|
|
|
|
if eq.Value == nil {
|
|
|
|
builder.Write(" IS NULL")
|
|
|
|
} else {
|
|
|
|
builder.Write(" = ", builder.AddVar(eq.Value))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (eq Eq) NegationBuild(builder Builder) {
|
|
|
|
Neq{eq.Column, eq.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Neq not equal to for where
|
|
|
|
type Neq Eq
|
|
|
|
|
|
|
|
func (neq Neq) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(neq.Column)
|
|
|
|
|
|
|
|
if neq.Value == nil {
|
|
|
|
builder.Write(" IS NOT NULL")
|
|
|
|
} else {
|
|
|
|
builder.Write(" <> ", builder.AddVar(neq.Value))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (neq Neq) NegationBuild(builder Builder) {
|
|
|
|
Eq{neq.Column, neq.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gt greater than for where
|
|
|
|
type Gt Eq
|
|
|
|
|
|
|
|
func (gt Gt) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(gt.Column)
|
|
|
|
builder.Write(" > ", builder.AddVar(gt.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gt Gt) NegationBuild(builder Builder) {
|
|
|
|
Lte{gt.Column, gt.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Gte greater than or equal to for where
|
|
|
|
type Gte Eq
|
|
|
|
|
|
|
|
func (gte Gte) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(gte.Column)
|
|
|
|
builder.Write(" >= ", builder.AddVar(gte.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (gte Gte) NegationBuild(builder Builder) {
|
|
|
|
Lt{gte.Column, gte.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Lt less than for where
|
|
|
|
type Lt Eq
|
|
|
|
|
|
|
|
func (lt Lt) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(lt.Column)
|
|
|
|
builder.Write(" < ", builder.AddVar(lt.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (lt Lt) NegationBuild(builder Builder) {
|
|
|
|
Gte{lt.Column, lt.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Lte less than or equal to for where
|
|
|
|
type Lte Eq
|
|
|
|
|
|
|
|
func (lte Lte) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(lte.Column)
|
|
|
|
builder.Write(" <= ", builder.AddVar(lte.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (lte Lte) NegationBuild(builder Builder) {
|
|
|
|
Gt{lte.Column, lte.Value}.Build(builder)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Like whether string matches regular expression
|
|
|
|
type Like Eq
|
|
|
|
|
|
|
|
func (like Like) Build(builder Builder) {
|
|
|
|
builder.WriteQuoted(like.Column)
|
|
|
|
builder.Write(" LIKE ", builder.AddVar(like.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
func (like Like) NegationBuild(builder Builder) {
|
|
|
|
builder.WriteQuoted(like.Column)
|
|
|
|
builder.Write(" NOT LIKE ", builder.AddVar(like.Value))
|
|
|
|
}
|
|
|
|
|
|
|
|
// Map
|
|
|
|
type Map map[interface{}]interface{}
|
|
|
|
|
|
|
|
func (m Map) Build(builder Builder) {
|
|
|
|
// TODO
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m Map) NegationBuild(builder Builder) {
|
|
|
|
// TODO
|
2020-01-30 10:14:48 +03:00
|
|
|
}
|