2020-01-30 10:14:48 +03:00
|
|
|
package clause
|
|
|
|
|
|
|
|
// 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-03-09 12:07:00 +03:00
|
|
|
var idx int
|
|
|
|
for _, v := range []byte(expr.SQL) {
|
|
|
|
if v == '?' {
|
|
|
|
builder.AddVar(builder, expr.Vars[idx])
|
|
|
|
idx++
|
|
|
|
} else {
|
|
|
|
builder.WriteByte(v)
|
|
|
|
}
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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:
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" IN (NULL)")
|
2020-02-07 18:45:35 +03:00
|
|
|
case 1:
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" = ")
|
|
|
|
builder.AddVar(builder, in.Values...)
|
2020-02-07 18:45:35 +03:00
|
|
|
default:
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" IN (")
|
|
|
|
builder.AddVar(builder, in.Values...)
|
|
|
|
builder.WriteByte(')')
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (in IN) NegationBuild(builder Builder) {
|
|
|
|
switch len(in.Values) {
|
|
|
|
case 0:
|
|
|
|
case 1:
|
2020-05-24 17:52:16 +03:00
|
|
|
builder.WriteQuoted(in.Column)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" <> ")
|
|
|
|
builder.AddVar(builder, in.Values...)
|
2020-02-07 18:45:35 +03:00
|
|
|
default:
|
2020-05-24 17:52:16 +03:00
|
|
|
builder.WriteQuoted(in.Column)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" NOT IN (")
|
|
|
|
builder.AddVar(builder, in.Values...)
|
|
|
|
builder.WriteByte(')')
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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 {
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" IS NULL")
|
2020-02-07 18:45:35 +03:00
|
|
|
} else {
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" = ")
|
|
|
|
builder.AddVar(builder, eq.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 {
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" IS NOT NULL")
|
2020-02-07 18:45:35 +03:00
|
|
|
} else {
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" <> ")
|
|
|
|
builder.AddVar(builder, neq.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" > ")
|
|
|
|
builder.AddVar(builder, gt.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" >= ")
|
|
|
|
builder.AddVar(builder, gte.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" < ")
|
|
|
|
builder.AddVar(builder, lt.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" <= ")
|
|
|
|
builder.AddVar(builder, lte.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" LIKE ")
|
|
|
|
builder.AddVar(builder, like.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func (like Like) NegationBuild(builder Builder) {
|
|
|
|
builder.WriteQuoted(like.Column)
|
2020-03-09 12:07:00 +03:00
|
|
|
builder.WriteString(" NOT LIKE ")
|
|
|
|
builder.AddVar(builder, like.Value)
|
2020-02-07 18:45:35 +03:00
|
|
|
}
|