From 39bc8d7e41688ee4699457b4238b8695f208db1e Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Sat, 30 Apr 2022 00:08:04 -0300 Subject: [PATCH 1/5] dialect/sql: move FROM to inside switch --- dialect/sql/builder.go | 4 +++- dialect/sql/builder_test.go | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dialect/sql/builder.go b/dialect/sql/builder.go index 1a2e247031..1bd1ead81f 100644 --- a/dialect/sql/builder.go +++ b/dialect/sql/builder.go @@ -2657,12 +2657,13 @@ func (s *Selector) Query() (string, []interface{}) { } else { b.WriteString("*") } - b.WriteString(" FROM ") switch t := s.from.(type) { case *SelectTable: + b.WriteString(" FROM ") t.SetDialect(s.dialect) b.WriteString(t.ref()) case *Selector: + b.WriteString(" FROM ") t.SetDialect(s.dialect) b.Nested(func(b *Builder) { b.Join(t) @@ -2670,6 +2671,7 @@ func (s *Selector) Query() (string, []interface{}) { b.WriteString(" AS ") b.Ident(t.as) case *WithBuilder: + b.WriteString(" FROM ") t.SetDialect(s.dialect) b.Ident(t.Name()) } diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 9435aa8812..00d8fb452a 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -1288,6 +1288,10 @@ func TestBuilder(t *testing.T) { wantQuery: "WITH `groups` AS (SELECT * FROM `groups` WHERE `name` = ?) SELECT `age` FROM `groups`", wantArgs: []interface{}{"bar"}, }, + { + input: SelectExpr(Raw("1")), + wantQuery: "SELECT 1", + }, { input: func() Querier { builder := Dialect(dialect.Postgres) From b2325c3a8a606acdcf4392ff454d46b919a1c69b Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Sat, 30 Apr 2022 00:33:56 -0300 Subject: [PATCH 2/5] dialect/sql: adds simple example of subquery usage --- dialect/sql/builder_test.go | 4 ++++ entc/integration/integration_test.go | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/dialect/sql/builder_test.go b/dialect/sql/builder_test.go index 00d8fb452a..5600f49143 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -1292,6 +1292,10 @@ func TestBuilder(t *testing.T) { input: SelectExpr(Raw("1")), wantQuery: "SELECT 1", }, + { + input: Select("*").From(SelectExpr(Raw("1")).As("s")), + wantQuery: "SELECT * FROM (SELECT 1) AS `s`", + }, { input: func() Querier { builder := Dialect(dialect.Postgres) diff --git a/entc/integration/integration_test.go b/entc/integration/integration_test.go index 5c74317b3d..102c421165 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -680,6 +680,15 @@ func Select(t *testing.T, client *ent.Client) { require.Len(gs, 2) require.Equal(hub.QueryUsers().CountX(ctx), gs[0].UsersCount) require.Equal(lab.QueryUsers().CountX(ctx), gs[1].UsersCount) + + // Select Subquery. + t.Log("select subquery") + subQuery := sql.SelectExpr(sql.Raw("1")) + i, err := client.User.Query().Modify(func(s *sql.Selector) { + s.Select("*").From(subQuery.As("s")) + }).Int(ctx) + require.NoError(err) + require.Equal(1, i) } func ExecQuery(t *testing.T, client *ent.Client) { From f584d05c1125ff8aebbd180fd6221eaa0a8802cf Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Sat, 30 Apr 2022 00:49:20 -0300 Subject: [PATCH 3/5] dialect/sql: adds a more complex example with join --- entc/integration/integration_test.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/entc/integration/integration_test.go b/entc/integration/integration_test.go index 102c421165..82de188a6a 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -689,6 +689,16 @@ func Select(t *testing.T, client *ent.Client) { }).Int(ctx) require.NoError(err) require.Equal(1, i) + // example with join + u = client.User.Create().SetName("crossworth").SetAge(28).SaveX(ctx) + userTable := sql.Table(user.Table) + subQuery = sql.Select("id").From(userTable).Where(sql.EQ(userTable.C(user.FieldName), "crossworth")) + users = client.User.Query().Modify(func(s *sql.Selector) { + s.Select("*").From(userTable) + s.Join(subQuery).On(userTable.C("id"), subQuery.C("id")) + }).AllX(ctx) + require.Len(users, 1) + require.Equal(u.ID, users[0].ID) } func ExecQuery(t *testing.T, client *ent.Client) { From 175668aa28ea4e8ab6a5501b71b4aa58d29b77bd Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Thu, 5 May 2022 15:59:38 -0300 Subject: [PATCH 4/5] Apply suggestions from code review Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> --- entc/integration/integration_test.go | 32 +++++++++++++++++----------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/entc/integration/integration_test.go b/entc/integration/integration_test.go index 82de188a6a..e795cdfe9e 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -683,22 +683,28 @@ func Select(t *testing.T, client *ent.Client) { // Select Subquery. t.Log("select subquery") - subQuery := sql.SelectExpr(sql.Raw("1")) - i, err := client.User.Query().Modify(func(s *sql.Selector) { - s.Select("*").From(subQuery.As("s")) - }).Int(ctx) + i, err := client.User. + Query(). + Modify(func(s *sql.Selector) { + subQuery := sql.SelectExpr(sql.Raw("1")).As("s") + s.Select("*").From(subQuery) + }). + Int(ctx) require.NoError(err) require.Equal(1, i) - // example with join + + // Select with join. u = client.User.Create().SetName("crossworth").SetAge(28).SaveX(ctx) - userTable := sql.Table(user.Table) - subQuery = sql.Select("id").From(userTable).Where(sql.EQ(userTable.C(user.FieldName), "crossworth")) - users = client.User.Query().Modify(func(s *sql.Selector) { - s.Select("*").From(userTable) - s.Join(subQuery).On(userTable.C("id"), subQuery.C("id")) - }).AllX(ctx) - require.Len(users, 1) - require.Equal(u.ID, users[0].ID) + id := client.User. + Query(). + Modify(func(s *sql.Selector) { + subQuery := sql.Select(user.FieldID). + From(sql.Table(user.Table)). + Where(sql.EQ(userT.C(user.FieldName), "crossworth")) + s.Join(subQuery).On(s.C(user.FieldID), subQuery.C(user.FieldID)) + }). + OnlyIDX(ctx) + require.Equal(u.ID, id) } func ExecQuery(t *testing.T, client *ent.Client) { From 91ebbc8af9f27bf5d2f5de37d1c9bcacdc0382a5 Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Thu, 5 May 2022 16:07:30 -0300 Subject: [PATCH 5/5] dialect/sql: fix missing type and change modify to where --- entc/integration/integration_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/entc/integration/integration_test.go b/entc/integration/integration_test.go index e795cdfe9e..abd589d8fb 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -692,15 +692,15 @@ func Select(t *testing.T, client *ent.Client) { Int(ctx) require.NoError(err) require.Equal(1, i) - + // Select with join. u = client.User.Create().SetName("crossworth").SetAge(28).SaveX(ctx) id := client.User. Query(). - Modify(func(s *sql.Selector) { + Where(func(s *sql.Selector) { subQuery := sql.Select(user.FieldID). From(sql.Table(user.Table)). - Where(sql.EQ(userT.C(user.FieldName), "crossworth")) + Where(sql.EQ(s.C(user.FieldName), "crossworth")) s.Join(subQuery).On(s.C(user.FieldID), subQuery.C(user.FieldID)) }). OnlyIDX(ctx)