From 088bfd75ad94c9ae761b543ee0eef33796c63b24 Mon Sep 17 00:00:00 2001 From: "Giau. Tran Minh" <12751435+giautm@users.noreply.github.com> Date: Mon, 17 Mar 2025 17:16:05 +0700 Subject: [PATCH] entc/gen/template: allow nested template access `Receiver` (#4354) --- doc/md/faq.md | 2 +- entc/gen/template/builder/create.tmpl | 6 +++--- entc/gen/template/builder/query.tmpl | 8 ++++---- entc/gen/template/builder/update.tmpl | 6 +++--- entc/gen/template/dialect/gremlin/group.tmpl | 2 +- entc/gen/template/dialect/gremlin/query.tmpl | 2 +- entc/gen/template/dialect/gremlin/select.tmpl | 2 +- entc/gen/template/dialect/sql/entql.tmpl | 2 +- entc/gen/template/dialect/sql/feature/lock.tmpl | 2 +- entc/gen/template/dialect/sql/feature/modifier.tmpl | 12 ++++++------ entc/gen/template/dialect/sql/feature/namedges.tmpl | 4 ++-- .../template/dialect/sql/feature/schemaconfig.tmpl | 6 +++--- entc/gen/template/dialect/sql/group.tmpl | 2 +- entc/gen/template/dialect/sql/query.tmpl | 4 ++-- entc/gen/template/dialect/sql/select.tmpl | 2 +- entc/gen/type.go | 9 +++++++++ entc/integration/template/ent/template/modifier.tmpl | 6 +++--- 17 files changed, 43 insertions(+), 34 deletions(-) diff --git a/doc/md/faq.md b/doc/md/faq.md index 051a1054f..7783648dd 100644 --- a/doc/md/faq.md +++ b/doc/md/faq.md @@ -39,7 +39,7 @@ use the following template: ```gotemplate {{ range $n := $.Nodes }} {{ $builder := $n.CreateName }} - {{ $receiver := receiver $builder }} + {{ $receiver := $n.CreateReceiver }} func ({{ $receiver }} *{{ $builder }}) Set{{ $n.Name }}(input *{{ $n.Name }}) *{{ $builder }} { {{- range $f := $n.Fields }} diff --git a/entc/gen/template/builder/create.tmpl b/entc/gen/template/builder/create.tmpl index 7acd21891..df1be57b5 100644 --- a/entc/gen/template/builder/create.tmpl +++ b/entc/gen/template/builder/create.tmpl @@ -147,8 +147,8 @@ func ({{ $receiver }} *{{ $builder }}) check() error { {{- end }} {{- end }} -{{ $bulk := printf "%sCreateBulk" (pascal $.Name) }} -{{ $receiver = receiver $bulk }} +{{ $bulk := $.CreateBulkName }} +{{ $receiver = $.CreateBulReceiver }} // {{ $bulk }} is the builder for creating many {{ $.Name }} entities in bulk. type {{ $bulk }} struct { @@ -165,7 +165,7 @@ type {{ $bulk }} struct { {{/* If the storage driver supports bulk creation */}} {{ $tmpl = printf "dialect/%s/create_bulk" $.Storage }} {{ if hasTemplate $tmpl }} - {{ with extend $ "Builder" $bulk "Receiver" $receiver }} + {{ with extend $ "Receiver" $receiver "Builder" $bulk }} {{ xtemplate $tmpl . }} {{ end }} {{ end }} diff --git a/entc/gen/template/builder/query.tmpl b/entc/gen/template/builder/query.tmpl index 004cd5f5a..959624150 100644 --- a/entc/gen/template/builder/query.tmpl +++ b/entc/gen/template/builder/query.tmpl @@ -16,7 +16,7 @@ in the LICENSE file in the root directory of this source tree. {{ end }} {{ $builder := $.QueryName }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.QueryReceiver }} // {{ $builder }} is the builder for querying {{ $.Name }} entities. type {{ $builder }} struct { @@ -412,7 +412,7 @@ func ({{ $receiver }} *{{ $builder }}) prepareQuery(ctx context.Context) error { return nil } -{{ with extend $ "Builder" $builder "Package" $pkg }} +{{ with extend $ "Receiver" $receiver "Builder" $builder "Package" $pkg }} {{ $tmpl := printf "dialect/%s/query" $.Storage }} {{ xtemplate $tmpl . }} {{ end }} @@ -451,7 +451,7 @@ func ({{ $groupReceiver }} *{{ $groupBuilder }}) Scan(ctx context.Context, v any return scanWithInterceptors[*{{ $builder }}, *{{ $groupBuilder }}](ctx, {{ $groupReceiver }}.build, {{ $groupReceiver }}, {{ $groupReceiver }}.build.inters, v) } -{{ with extend $ "Builder" $groupBuilder }} +{{ with extend $ "Receiver" $groupReceiver "Builder" $groupBuilder }} {{ $tmpl := printf "dialect/%s/group" $.Storage }} {{ xtemplate $tmpl . }} {{ end }} @@ -481,7 +481,7 @@ func ({{ $selectReceiver }} *{{ $selectBuilder }}) Scan(ctx context.Context, v a return scanWithInterceptors[*{{ $builder }}, *{{ $selectBuilder }}](ctx, {{ $selectReceiver }}.{{ $.QueryName }}, {{ $selectReceiver }}, {{ $selectReceiver }}.inters, v) } -{{ with extend $ "Builder" $selectBuilder }} +{{ with extend $ "Receiver" $selectReceiver "Builder" $selectBuilder }} {{ $tmpl := printf "dialect/%s/select" $.Storage }} {{ xtemplate $tmpl . }} {{ end }} diff --git a/entc/gen/template/builder/update.tmpl b/entc/gen/template/builder/update.tmpl index 837da4ed1..c04654c47 100644 --- a/entc/gen/template/builder/update.tmpl +++ b/entc/gen/template/builder/update.tmpl @@ -76,7 +76,7 @@ func ({{ $receiver }} *{{ $builder }}) ExecX(ctx context.Context) { } } -{{ with extend $ "Receiver" $receiver "Package" $pkg "Builder" $builder }} +{{ with extend $ "Receiver" $receiver "Builder" $builder "Package" $pkg }} {{ template "update/checks" . }} {{ end }} @@ -86,7 +86,7 @@ func ({{ $receiver }} *{{ $builder }}) ExecX(ctx context.Context) { {{ end }} {{ $onebuilder := $.UpdateOneName }} -{{ $receiver = receiver $onebuilder }} +{{ $receiver = $.UpdateOneReceiver }} {{ $mutation = print $receiver ".mutation" }} // {{ $onebuilder }} is the builder for updating a single {{ $.Name }} entity. @@ -154,7 +154,7 @@ func ({{ $receiver }} *{{ $onebuilder }}) ExecX(ctx context.Context) { } } -{{ with extend $ "Receiver" $receiver "Package" $pkg "Builder" $onebuilder }} +{{ with extend $ "Receiver" $receiver "Builder" $onebuilder "Package" $pkg }} {{ template "update/checks" . }} {{ end }} diff --git a/entc/gen/template/dialect/gremlin/group.tmpl b/entc/gen/template/dialect/gremlin/group.tmpl index cad0b19fc..7fe6bdb26 100644 --- a/entc/gen/template/dialect/gremlin/group.tmpl +++ b/entc/gen/template/dialect/gremlin/group.tmpl @@ -8,7 +8,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/gremlin/group" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) gremlinScan(ctx context.Context, root *{{ $.QueryName }}, v any) error { var ( diff --git a/entc/gen/template/dialect/gremlin/query.tmpl b/entc/gen/template/dialect/gremlin/query.tmpl index 73736a1bc..b1dc73418 100644 --- a/entc/gen/template/dialect/gremlin/query.tmpl +++ b/entc/gen/template/dialect/gremlin/query.tmpl @@ -8,7 +8,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/gremlin/query" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) gremlinAll(ctx context.Context, hooks ...queryHook) ([]*{{ $.Name }}, error) { res := &gremlin.Response{} diff --git a/entc/gen/template/dialect/gremlin/select.tmpl b/entc/gen/template/dialect/gremlin/select.tmpl index 6087b0f97..5f871d164 100644 --- a/entc/gen/template/dialect/gremlin/select.tmpl +++ b/entc/gen/template/dialect/gremlin/select.tmpl @@ -8,7 +8,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/gremlin/select" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) gremlinScan(ctx context.Context, root *{{ $.QueryName }}, v any) error { var ( diff --git a/entc/gen/template/dialect/sql/entql.tmpl b/entc/gen/template/dialect/sql/entql.tmpl index 7ff37027b..729a5c865 100644 --- a/entc/gen/template/dialect/sql/entql.tmpl +++ b/entc/gen/template/dialect/sql/entql.tmpl @@ -85,7 +85,7 @@ type predicateAdder interface { {{ range $i, $n := $.Nodes }} {{ $builder := $n.QueryName }} - {{ $receiver := receiver $builder }} + {{ $receiver := $n.QueryReceiver }} {{ $mutation := $n.MutationName }} {{ $filter := print $n.FilterName }} diff --git a/entc/gen/template/dialect/sql/feature/lock.tmpl b/entc/gen/template/dialect/sql/feature/lock.tmpl index 63e744ef4..ae858daa9 100644 --- a/entc/gen/template/dialect/sql/feature/lock.tmpl +++ b/entc/gen/template/dialect/sql/feature/lock.tmpl @@ -16,7 +16,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "helper/sqlock" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} // ForUpdate locks the selected rows against concurrent updates, and prevent them from being // updated, deleted or "selected ... for update" by other sessions, until the transaction is diff --git a/entc/gen/template/dialect/sql/feature/modifier.tmpl b/entc/gen/template/dialect/sql/feature/modifier.tmpl index 17aa73da8..825d880ca 100644 --- a/entc/gen/template/dialect/sql/feature/modifier.tmpl +++ b/entc/gen/template/dialect/sql/feature/modifier.tmpl @@ -18,7 +18,7 @@ in the LICENSE file in the root directory of this source tree. {{/* Template for adding the "executing" the list of modifiers on the sql.Selector. */}} {{ define "dialect/sql/query/selector/modify" }} {{- if or ($.FeatureEnabled "sql/lock") ($.FeatureEnabled "sql/modifier") }} - {{- $receiver := pascal $.Scope.Builder | receiver }} + {{- $receiver := $.Scope.Receiver }} for _, m := range {{ $receiver }}.modifiers { m(selector) } @@ -28,7 +28,7 @@ in the LICENSE file in the root directory of this source tree. {{/* Template for passing the modifiers to the sqlgraph.QuerySpec. */}} {{ define "dialect/sql/query/spec/modify" }} {{- if or ($.FeatureEnabled "sql/lock") ($.FeatureEnabled "sql/modifier") }} - {{- $receiver := pascal $.Scope.Builder | receiver }} + {{- $receiver := $.Scope.Receiver }} if len({{ $receiver }}.modifiers) > 0 { _spec.Modifiers = {{ $receiver }}.modifiers } @@ -39,7 +39,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/query/additional/modify" }} {{ if $.FeatureEnabled "sql/modifier" }} {{ $builder := pascal $.Scope.Builder }} - {{ $receiver := receiver $builder }} + {{ $receiver := $.Scope.Receiver }} {{ $selectBuilder := pascal $.Name | printf "%sSelect" }} // Modify adds a query modifier for attaching custom logic to queries. func ({{ $receiver }} *{{ $builder }}) Modify(modifiers ...func(s *sql.Selector)) *{{ $selectBuilder }} { @@ -53,7 +53,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/select/additional/modify" }} {{ if $.FeatureEnabled "sql/modifier" }} {{ $builder := pascal $.Scope.Builder }} - {{ $receiver := receiver $builder }} + {{ $receiver := $.Scope.Receiver }} // Modify adds a query modifier for attaching custom logic to queries. func ({{ $receiver }} *{{ $builder }}) Modify(modifiers ...func(s *sql.Selector)) *{{ $builder }} { {{ $receiver }}.modifiers = append({{ $receiver }}.modifiers, modifiers...) @@ -74,7 +74,7 @@ in the LICENSE file in the root directory of this source tree. {{ if $.FeatureEnabled "sql/modifier" }} {{ $pkg := $.Scope.Package }} {{ $builder := pascal $.Scope.Builder }} - {{ $receiver := receiver $builder }} + {{ $receiver := $.Scope.Receiver }} // Modify adds a statement modifier for attaching custom logic to the UPDATE statement. func ({{ $receiver }} *{{ $builder }}) Modify(modifiers ...func(u *sql.UpdateBuilder)) *{{ $builder }} { {{ $receiver }}.modifiers = append({{ $receiver }}.modifiers, modifiers...) @@ -86,7 +86,7 @@ in the LICENSE file in the root directory of this source tree. {{/* Template for passing the modifiers to the sqlgraph.UpdateSpec. */}} {{ define "dialect/sql/update/spec/modify" }} {{- if $.FeatureEnabled "sql/modifier" }} - {{- $receiver := pascal $.Scope.Builder | receiver }} + {{- $receiver := $.Scope.Receiver }} _spec.AddModifiers({{ $receiver }}.modifiers...) {{- end }} {{- end -}} \ No newline at end of file diff --git a/entc/gen/template/dialect/sql/feature/namedges.tmpl b/entc/gen/template/dialect/sql/feature/namedges.tmpl index cbb549985..0e647d061 100644 --- a/entc/gen/template/dialect/sql/feature/namedges.tmpl +++ b/entc/gen/template/dialect/sql/feature/namedges.tmpl @@ -66,7 +66,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/query/additional/namedges" }} {{- if $.FeatureEnabled "namedges" }} {{ $builder := $.QueryName }} - {{ $receiver := receiver $builder }} + {{ $receiver := $.QueryReceiver }} {{- range $e := $.Edges }} {{- if not $e.Unique }} {{ $ebuilder := $e.Type.QueryName }} @@ -93,7 +93,7 @@ in the LICENSE file in the root directory of this source tree. {{- define "dialect/sql/query/all/nodes/namedges" }} {{- if $.FeatureEnabled "namedges" }} {{- $builder := pascal $.Scope.Builder }} - {{- $receiver := receiver $builder }} + {{- $receiver := $.Scope.Receiver }} {{- range $e := $.Edges }} {{- if not $e.Unique }} for name, query := range {{ $receiver }}.{{ $e.EagerLoadNamedField }} { diff --git a/entc/gen/template/dialect/sql/feature/schemaconfig.tmpl b/entc/gen/template/dialect/sql/feature/schemaconfig.tmpl index be83edf08..67ea2d5f6 100644 --- a/entc/gen/template/dialect/sql/feature/schemaconfig.tmpl +++ b/entc/gen/template/dialect/sql/feature/schemaconfig.tmpl @@ -100,7 +100,7 @@ func NewSchemaConfigContext(parent context.Context, config SchemaConfig) context {{- define "dialect/sql/defedge/spec/schemaconfig" }} {{- $e := $.Scope.Edge }} {{- $builder := pascal $.Scope.Builder }} - {{- $receiver := receiver $builder }} + {{- $receiver := $.Scope.Receiver }} {{- $ident := "edge" }}{{ with $.Scope.Ident }}{{ $ident = . }}{{ end }} {{- if $.FeatureEnabled "sql/schemaconfig" }} {{- $schema := $e.Type.Name }} @@ -126,7 +126,7 @@ func NewSchemaConfigContext(parent context.Context, config SchemaConfig) context {{/* A template for injecting the SchemaConfig to the context. Should be executed before other templates. */}} {{- define "dialect/sql/spec/ctxschemaconfig" -}} {{- $builder := pascal $.Scope.Builder }} - {{- $receiver := receiver $builder }} + {{- $receiver := $.Scope.Receiver }} {{- $ident := "_spec.Node" }}{{ with $.Scope.Ident }}{{ $ident = . }}{{ end }} {{- if $.FeatureEnabled "sql/schemaconfig" }} {{ $ident }}.Schema = {{ $receiver }}.schemaConfig.{{ $.Name }} @@ -138,7 +138,7 @@ func NewSchemaConfigContext(parent context.Context, config SchemaConfig) context {{- define "dialect/sql/query/selector/ctxschemaconfig" -}} {{- $builder := pascal $.Scope.Builder }} - {{- $receiver := receiver $builder }} + {{- $receiver := $.Scope.Receiver }} {{- if $.FeatureEnabled "sql/schemaconfig" }} t1.Schema({{ $receiver }}.schemaConfig.{{ $.Name }}) ctx = internal.NewSchemaConfigContext(ctx, {{ $receiver }}.schemaConfig) diff --git a/entc/gen/template/dialect/sql/group.tmpl b/entc/gen/template/dialect/sql/group.tmpl index 360eb6a46..7edd2d91e 100644 --- a/entc/gen/template/dialect/sql/group.tmpl +++ b/entc/gen/template/dialect/sql/group.tmpl @@ -8,7 +8,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/group" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) sqlScan(ctx context.Context, root *{{ $.QueryName }}, v any) error { selector := root.sqlQuery(ctx).Select() diff --git a/entc/gen/template/dialect/sql/query.tmpl b/entc/gen/template/dialect/sql/query.tmpl index 192b2e3b1..70f01e4bc 100644 --- a/entc/gen/template/dialect/sql/query.tmpl +++ b/entc/gen/template/dialect/sql/query.tmpl @@ -21,7 +21,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/query" }} {{ $pkg := $.Scope.Package }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) sqlAll(ctx context.Context, hooks ...queryHook) ([]*{{ $.Name }}, error) { var ( @@ -353,7 +353,7 @@ func ({{ $receiver }} *{{ $builder }}) querySpec() *sqlgraph.QuerySpec { {{ define "dialect/sql/query/selector" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) sqlQuery(ctx context.Context) *sql.Selector { {{- $builderV := "builder" }}{{ if eq $.Package $builderV }}{{ $builderV = "builderC" }}{{ end }} diff --git a/entc/gen/template/dialect/sql/select.tmpl b/entc/gen/template/dialect/sql/select.tmpl index 929200e1d..ee5e67344 100644 --- a/entc/gen/template/dialect/sql/select.tmpl +++ b/entc/gen/template/dialect/sql/select.tmpl @@ -8,7 +8,7 @@ in the LICENSE file in the root directory of this source tree. {{ define "dialect/sql/select" }} {{ $builder := pascal $.Scope.Builder }} -{{ $receiver := receiver $builder }} +{{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) sqlScan(ctx context.Context, root *{{ $.QueryName }}, v any) error { selector := root.sqlQuery(ctx) diff --git a/entc/gen/type.go b/entc/gen/type.go index 782811cc1..01730024d 100644 --- a/entc/gen/type.go +++ b/entc/gen/type.go @@ -823,6 +823,15 @@ func (t Type) QueryName() string { return pascal(t.Name) + "Query" } +// QueryReceiver returns the receiver name of the query-builder for this type. +func (t Type) QueryReceiver() string { + r := receiver(t.QueryName()) + if t.Package() == r { + return "_" + r + } + return r +} + // FilterName returns the struct name denoting the filter-builder for this type. func (t Type) FilterName() string { return pascal(t.Name) + "Filter" diff --git a/entc/integration/template/ent/template/modifier.tmpl b/entc/integration/template/ent/template/modifier.tmpl index 2a33bf599..85f5c46c1 100644 --- a/entc/integration/template/ent/template/modifier.tmpl +++ b/entc/integration/template/ent/template/modifier.tmpl @@ -4,7 +4,7 @@ {{/* A template for adding the Modify method to the query builder. */}} {{ define "dialect/sql/query/additional/modify" }} {{ $builder := pascal $.Scope.Builder }} - {{ $receiver := receiver $builder }} + {{ $receiver := $.Scope.Receiver }} func ({{ $receiver }} *{{ $builder }}) Modify(modifier func(s *sql.Selector)) *{{ $builder }} { {{ $receiver }}.modifiers = append({{ $receiver }}.modifiers, modifier) return {{ $receiver }} @@ -16,14 +16,14 @@ {{- end }} {{ define "dialect/sql/query/selector/modify" }} - {{- $receiver := pascal $.Scope.Builder | receiver }} + {{- $receiver := $.Scope.Receiver }} for _, m := range {{ $receiver }}.modifiers { m(selector) } {{- end -}} {{ define "dialect/sql/query/spec/modify" }} - {{- $receiver := pascal $.Scope.Builder | receiver }} + {{- $receiver := $.Scope.Receiver }} if len({{ $receiver }}.modifiers) > 0 { _spec.Modifiers = {{ $receiver }}.modifiers }