mirror of
https://github.com/ent/ent.git
synced 2026-05-24 09:31:56 +03:00
dialect/sql: fix predicate builder on join
Summary: Pull Request resolved: https://github.com/facebookincubator/ent/pull/143 Reviewed By: idoshveki Differential Revision: D18346652 fbshipit-source-id: e8c5d7eb3cefc16f52090de0d121e82cae058fc2
This commit is contained in:
committed by
Facebook Github Bot
parent
7a6d1ce9dc
commit
53cfcb6e8b
@@ -731,6 +731,9 @@ func P() *Predicate { return &Predicate{} }
|
||||
//
|
||||
func Or(preds ...*Predicate) *Predicate {
|
||||
return P().append(func(b *Builder) {
|
||||
if len(preds) > 1 {
|
||||
b.WriteString("(")
|
||||
}
|
||||
for i := range preds {
|
||||
if i > 0 {
|
||||
b.WriteString(" OR ")
|
||||
@@ -739,6 +742,9 @@ func Or(preds ...*Predicate) *Predicate {
|
||||
b.Join(preds[i])
|
||||
})
|
||||
}
|
||||
if len(preds) > 1 {
|
||||
b.WriteString(")")
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
@@ -1317,6 +1323,19 @@ func (s *Selector) Where(p *Predicate) *Selector {
|
||||
return s
|
||||
}
|
||||
|
||||
// P returns the predicate of a selector.
|
||||
func (s *Selector) P() *Predicate {
|
||||
return s.where
|
||||
}
|
||||
|
||||
// SetP sets explicitly the predicate function for the selector and clear its previous state.
|
||||
func (s *Selector) SetP(p *Predicate) *Selector {
|
||||
s.where = p
|
||||
s.or = false
|
||||
s.not = false
|
||||
return s
|
||||
}
|
||||
|
||||
// FromSelect copies the predicate from a selector.
|
||||
func (s *Selector) FromSelect(s2 *Selector) *Selector {
|
||||
s.where = s2.where
|
||||
|
||||
@@ -492,7 +492,7 @@ func TestBuilder(t *testing.T) {
|
||||
),
|
||||
),
|
||||
),
|
||||
wantQuery: "DELETE FROM `users` WHERE (`name` = ? AND `age` = ?) OR (`name` = ? AND `age` = ?) OR ((`name` = ?) AND (`age` = ? OR `age` = ?))",
|
||||
wantQuery: "DELETE FROM `users` WHERE ((`name` = ? AND `age` = ?) OR (`name` = ? AND `age` = ?) OR ((`name` = ?) AND (`age` = ? OR `age` = ?)))",
|
||||
wantArgs: []interface{}{"foo", 10, "bar", 20, "qux", 1, 2},
|
||||
},
|
||||
{
|
||||
@@ -508,9 +508,34 @@ func TestBuilder(t *testing.T) {
|
||||
),
|
||||
),
|
||||
),
|
||||
wantQuery: `DELETE FROM "users" WHERE ("name" = $1 AND "age" = $2) OR ("name" = $3 AND "age" = $4) OR (("name" = $5) AND ("age" = $6 OR "age" = $7))`,
|
||||
wantQuery: `DELETE FROM "users" WHERE (("name" = $1 AND "age" = $2) OR ("name" = $3 AND "age" = $4) OR (("name" = $5) AND ("age" = $6 OR "age" = $7)))`,
|
||||
wantArgs: []interface{}{"foo", 10, "bar", 20, "qux", 1, 2},
|
||||
},
|
||||
{
|
||||
input: Delete("users").
|
||||
Where(
|
||||
Or(
|
||||
EQ("name", "foo").And().EQ("age", 10),
|
||||
EQ("name", "bar").And().EQ("age", 20),
|
||||
),
|
||||
).
|
||||
Where(EQ("role", "admin")),
|
||||
wantQuery: "DELETE FROM `users` WHERE ((`name` = ? AND `age` = ?) OR (`name` = ? AND `age` = ?)) AND `role` = ?",
|
||||
wantArgs: []interface{}{"foo", 10, "bar", 20, "admin"},
|
||||
},
|
||||
{
|
||||
input: Dialect(dialect.Postgres).
|
||||
Delete("users").
|
||||
Where(
|
||||
Or(
|
||||
EQ("name", "foo").And().EQ("age", 10),
|
||||
EQ("name", "bar").And().EQ("age", 20),
|
||||
),
|
||||
).
|
||||
Where(EQ("role", "admin")),
|
||||
wantQuery: `DELETE FROM "users" WHERE (("name" = $1 AND "age" = $2) OR ("name" = $3 AND "age" = $4)) AND "role" = $5`,
|
||||
wantArgs: []interface{}{"foo", 10, "bar", 20, "admin"},
|
||||
},
|
||||
{
|
||||
input: Select().From(Table("users")),
|
||||
wantQuery: "SELECT * FROM `users`",
|
||||
@@ -985,7 +1010,7 @@ func TestBuilder(t *testing.T) {
|
||||
},
|
||||
{
|
||||
input: Select("age").From(Table("users")).Where(EQ("name", "foo")).Or().Where(EQ("name", "bar")),
|
||||
wantQuery: "SELECT `age` FROM `users` WHERE (`name` = ?) OR (`name` = ?)",
|
||||
wantQuery: "SELECT `age` FROM `users` WHERE ((`name` = ?) OR (`name` = ?))",
|
||||
wantArgs: []interface{}{"foo", "bar"},
|
||||
},
|
||||
{
|
||||
@@ -993,7 +1018,7 @@ func TestBuilder(t *testing.T) {
|
||||
Select("age").
|
||||
From(Table("users")).
|
||||
Where(EQ("name", "foo")).Or().Where(EQ("name", "bar")),
|
||||
wantQuery: `SELECT "age" FROM "users" WHERE ("name" = $1) OR ("name" = $2)`,
|
||||
wantQuery: `SELECT "age" FROM "users" WHERE (("name" = $1) OR ("name" = $2))`,
|
||||
wantArgs: []interface{}{"foo", "bar"},
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user