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:
Ariel Mashraki
2019-11-06 05:19:52 -08:00
committed by Facebook Github Bot
parent 7a6d1ce9dc
commit 53cfcb6e8b
46 changed files with 366 additions and 132 deletions

View File

@@ -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

View File

@@ -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"},
},
{