|
@@ -0,0 +1,195 @@
|
|
|
+package clause
|
|
|
+
|
|
|
+import "strings"
|
|
|
+
|
|
|
+type AddConditions []Interface
|
|
|
+
|
|
|
+func (cs AddConditions) Build(builder BuilderInterface) {
|
|
|
+ for idx, c := range cs {
|
|
|
+ if idx > 0 {
|
|
|
+ builder.Write(" AND ")
|
|
|
+ }
|
|
|
+ c.Build(builder)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+type ORConditions []Interface
|
|
|
+
|
|
|
+func (cs ORConditions) Build(builder BuilderInterface) {
|
|
|
+ for idx, c := range cs {
|
|
|
+ if idx > 0 {
|
|
|
+ builder.Write(" OR ")
|
|
|
+ }
|
|
|
+ c.Build(builder)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+type NotConditions []Interface
|
|
|
+
|
|
|
+func (cs NotConditions) Build(builder BuilderInterface) {
|
|
|
+ for idx, c := range cs {
|
|
|
+ if idx > 0 {
|
|
|
+ builder.Write(" AND ")
|
|
|
+ }
|
|
|
+
|
|
|
+ if negationBuilder, ok := c.(NegationBuilder); ok {
|
|
|
+ negationBuilder.NegationBuild(builder)
|
|
|
+ } else {
|
|
|
+ builder.Write(" NOT ")
|
|
|
+ c.Build(builder)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Raw raw sql for where
|
|
|
+type Raw struct {
|
|
|
+ SQL string
|
|
|
+ Values []interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (raw Raw) Build(builder BuilderInterface) {
|
|
|
+ sql := raw.SQL
|
|
|
+ for _, v := range raw.Values {
|
|
|
+ sql = strings.Replace(sql, " ? ", " "+builder.AddVar(v)+" ", 1)
|
|
|
+ }
|
|
|
+ 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 BuilderInterface) {
|
|
|
+ builder.WriteQuoted(in.Column)
|
|
|
+
|
|
|
+ if len(in.Values) == 0 {
|
|
|
+ builder.Write(" IN (NULL)")
|
|
|
+ } else {
|
|
|
+ builder.Write(" IN (", builder.AddVar(in.Values...), ")")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (in IN) NegationBuild(builder BuilderInterface) {
|
|
|
+ if len(in.Values) != 0 {
|
|
|
+ builder.WriteQuoted(in.Column)
|
|
|
+ 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 BuilderInterface) {
|
|
|
+ builder.WriteQuoted(eq.Column)
|
|
|
+
|
|
|
+ if eq.Value == nil {
|
|
|
+ builder.Write(" IS NULL")
|
|
|
+ } else {
|
|
|
+ builder.Write(" = ", builder.AddVar(eq.Value))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func (eq Eq) NegationBuild(builder BuilderInterface) {
|
|
|
+ Neq{eq.Column, eq.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Neq not equal to for where
|
|
|
+type Neq struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (neq Neq) Build(builder BuilderInterface) {
|
|
|
+ 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 BuilderInterface) {
|
|
|
+ Eq{neq.Column, neq.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Gt greater than for where
|
|
|
+type Gt struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (gt Gt) Build(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(gt.Column)
|
|
|
+ builder.Write(" > ", builder.AddVar(gt.Value))
|
|
|
+}
|
|
|
+
|
|
|
+func (gt Gt) NegationBuild(builder BuilderInterface) {
|
|
|
+ Lte{gt.Column, gt.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Gte greater than or equal to for where
|
|
|
+type Gte struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (gte Gte) Build(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(gte.Column)
|
|
|
+ builder.Write(" >= ", builder.AddVar(gte.Value))
|
|
|
+}
|
|
|
+
|
|
|
+func (gte Gte) NegationBuild(builder BuilderInterface) {
|
|
|
+ Lt{gte.Column, gte.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Lt less than for where
|
|
|
+type Lt struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (lt Lt) Build(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(lt.Column)
|
|
|
+ builder.Write(" < ", builder.AddVar(lt.Value))
|
|
|
+}
|
|
|
+
|
|
|
+func (lt Lt) NegationBuild(builder BuilderInterface) {
|
|
|
+ Gte{lt.Column, lt.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Lte less than or equal to for where
|
|
|
+type Lte struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (lte Lte) Build(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(lte.Column)
|
|
|
+ builder.Write(" <= ", builder.AddVar(lte.Value))
|
|
|
+}
|
|
|
+
|
|
|
+func (lte Lte) NegationBuild(builder BuilderInterface) {
|
|
|
+ Gt{lte.Column, lte.Value}.Build(builder)
|
|
|
+}
|
|
|
+
|
|
|
+// Like whether string matches regular expression
|
|
|
+type Like struct {
|
|
|
+ Column interface{}
|
|
|
+ Value interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func (like Like) Build(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(like.Column)
|
|
|
+ builder.Write(" LIKE ", builder.AddVar(like.Value))
|
|
|
+}
|
|
|
+
|
|
|
+func (like Like) NegationBuild(builder BuilderInterface) {
|
|
|
+ builder.WriteQuoted(like.Column)
|
|
|
+ builder.Write(" NOT LIKE ", builder.AddVar(like.Value))
|
|
|
+}
|