From 4d1c0af20d931a36f03077784b544df66fc297b9 Mon Sep 17 00:00:00 2001 From: Pedro Henrique Date: Thu, 5 May 2022 16:46:13 -0300 Subject: [PATCH] entc/integration: add examples for sub-queries + minor fixed for selector builder (#2509) * dialect/sql: move FROM to inside switch * dialect/sql: adds simple example of subquery usage * dialect/sql: adds a more complex example with join * Apply suggestions from code review Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> * dialect/sql: fix missing type and change modify to where Co-authored-by: Ariel Mashraki <7413593+a8m@users.noreply.github.com> --- dialect/sql/builder.go | 4 +++- dialect/sql/builder_test.go | 8 ++++++++ entc/integration/integration_test.go | 25 +++++++++++++++++++++++++ 3 files changed, 36 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..5600f49143 100644 --- a/dialect/sql/builder_test.go +++ b/dialect/sql/builder_test.go @@ -1288,6 +1288,14 @@ 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: 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..abd589d8fb 100644 --- a/entc/integration/integration_test.go +++ b/entc/integration/integration_test.go @@ -680,6 +680,31 @@ 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") + 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) + + // Select with join. + u = client.User.Create().SetName("crossworth").SetAge(28).SaveX(ctx) + id := client.User. + Query(). + Where(func(s *sql.Selector) { + subQuery := sql.Select(user.FieldID). + From(sql.Table(user.Table)). + Where(sql.EQ(s.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) {