forked from mirror/gorm
Test GroupConditions
This commit is contained in:
parent
4f19e2a7b3
commit
3d8f6f9cf9
|
@ -66,8 +66,12 @@ func (and AndConditions) Build(builder Builder) {
|
||||||
}
|
}
|
||||||
for idx, c := range and.Exprs {
|
for idx, c := range and.Exprs {
|
||||||
if idx > 0 {
|
if idx > 0 {
|
||||||
|
if orConditions, ok := c.(OrConditions); ok && len(orConditions.Exprs) == 1 {
|
||||||
|
builder.WriteString(" OR ")
|
||||||
|
} else {
|
||||||
builder.WriteString(" AND ")
|
builder.WriteString(" AND ")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
c.Build(builder)
|
c.Build(builder)
|
||||||
}
|
}
|
||||||
if len(and.Exprs) > 1 {
|
if len(and.Exprs) > 1 {
|
||||||
|
|
|
@ -53,6 +53,12 @@ func TestWhere(t *testing.T) {
|
||||||
}},
|
}},
|
||||||
"SELECT * FROM `users` WHERE (`users`.`id` <> ? AND `age` <= ?) OR `name` <> ? AND (`score` <= ? OR `name` LIKE ?)", []interface{}{"1", 18, "jinzhu", 100, "%linus%"},
|
"SELECT * FROM `users` WHERE (`users`.`id` <> ? AND `age` <= ?) OR `name` <> ? AND (`score` <= ? OR `name` LIKE ?)", []interface{}{"1", 18, "jinzhu", 100, "%linus%"},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
[]clause.Interface{clause.Select{}, clause.From{}, clause.Where{
|
||||||
|
Exprs: []clause.Expression{clause.And(clause.Eq{Column: "age", Value: 18}, clause.Or(clause.Neq{Column: "name", Value: "jinzhu"}))},
|
||||||
|
}},
|
||||||
|
"SELECT * FROM `users` WHERE (`age` = ? OR `name` <> ?)", []interface{}{18, "jinzhu"},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx, result := range results {
|
for idx, result := range results {
|
||||||
|
|
|
@ -245,6 +245,14 @@ func (stmt *Statement) BuildCondition(query interface{}, args ...interface{}) (c
|
||||||
switch v := arg.(type) {
|
switch v := arg.(type) {
|
||||||
case clause.Expression:
|
case clause.Expression:
|
||||||
conds = append(conds, v)
|
conds = append(conds, v)
|
||||||
|
case *DB:
|
||||||
|
if cs, ok := v.Statement.Clauses["WHERE"]; ok {
|
||||||
|
if where, ok := cs.Expression.(clause.Where); ok {
|
||||||
|
conds = append(conds, clause.And(where.Exprs...))
|
||||||
|
} else if cs.Expression != nil {
|
||||||
|
conds = append(conds, cs.Expression)
|
||||||
|
}
|
||||||
|
}
|
||||||
case map[interface{}]interface{}:
|
case map[interface{}]interface{}:
|
||||||
for i, j := range v {
|
for i, j := range v {
|
||||||
conds = append(conds, clause.Eq{Column: i, Value: j})
|
conds = append(conds, clause.Eq{Column: i, Value: j})
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package tests_test
|
package tests_test
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
@ -138,3 +139,27 @@ func TestDryRun(t *testing.T) {
|
||||||
t.Errorf("Failed to generate sql, got %v", stmt2.SQL.String())
|
t.Errorf("Failed to generate sql, got %v", stmt2.SQL.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGroupConditions(t *testing.T) {
|
||||||
|
type Pizza struct {
|
||||||
|
ID uint
|
||||||
|
Name string
|
||||||
|
Size string
|
||||||
|
}
|
||||||
|
dryRunDB := DB.Session(&gorm.Session{DryRun: true})
|
||||||
|
|
||||||
|
stmt := dryRunDB.Where(
|
||||||
|
DB.Where("pizza = ?", "pepperoni").Where(DB.Where("size = ?", "small").Or("size = ?", "medium")),
|
||||||
|
).Or(
|
||||||
|
DB.Where("pizza = ?", "hawaiian").Where("size = ?", "xlarge"),
|
||||||
|
).Find(&Pizza{}).Statement
|
||||||
|
|
||||||
|
execStmt := dryRunDB.Exec("WHERE (pizza = ? AND (size = ? OR size = ?)) OR (pizza = ? AND size = ?)", "pepperoni", "small", "medium", "hawaiian", "xlarge").Statement
|
||||||
|
|
||||||
|
result := DB.Dialector.Explain(stmt.SQL.String(), stmt.Vars...)
|
||||||
|
expects := DB.Dialector.Explain(execStmt.SQL.String(), execStmt.Vars...)
|
||||||
|
|
||||||
|
if !strings.HasSuffix(result, expects) {
|
||||||
|
t.Errorf("expects: %v, got %v", expects, result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue