Files
ent/entc/gen/template/dialect/sql/query.tmpl
2019-12-22 19:42:28 +02:00

142 lines
4.6 KiB
Cheetah

{{/*
Copyright 2019-present Facebook Inc. All rights reserved.
This source code is licensed under the Apache 2.0 license found
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 }}
func ({{ $receiver }} *{{ $builder }}) sqlAll(ctx context.Context) ([]*{{ $.Name }}, error) {
rows := &sql.Rows{}
selector := {{ $receiver }}.sqlQuery()
if unique := {{ $receiver }}.unique; len(unique) == 0 {
selector.Distinct()
}
query, args := selector.Query()
if err := {{ $receiver }}.driver.Query(ctx, query, args, rows); err != nil {
return nil, err
}
defer rows.Close()
{{- $ret := plural $.Receiver }}
var {{ $ret }} {{ plural $.Name }}
if err := {{ $ret }}.FromRows(rows); err != nil {
return nil, err
}
{{ $ret }}.config({{ $receiver }}.config)
return {{ $ret }}, nil
}
func ({{ $receiver }} *{{ $builder }}) sqlCount(ctx context.Context) (int, error) {
spec := &sqlgraph.QuerySpec{
Node: &sqlgraph.NodeSpec{
Table: {{ $.Package }}.Table,
Columns: []string{
{{ $.Package }}.{{ $.ID.Constant }},
},
ID: &sqlgraph.FieldSpec{
Type: field.{{ $.ID.Type.ConstName }},
Column: {{ $.Package }}.{{ $.ID.Constant }},
},
},
From: {{ $receiver }}.sql,
Unique: true,
}
if ps := {{ $receiver }}.predicates; len(ps) > 0 {
spec.Predicate = func(selector *sql.Selector) {
for i := range ps {
ps[i](selector)
}
}
}
if limit := {{ $receiver }}.limit; limit != nil {
spec.Limit = *limit
}
if offset := {{ $receiver }}.offset; offset != nil {
spec.Offset = *offset
}
if ps := {{ $receiver }}.order; len(ps) > 0 {
spec.Order = func(selector *sql.Selector) {
for i := range ps {
ps[i](selector)
}
}
}
return sqlgraph.CountNodes(ctx, {{ $receiver }}.driver, spec)
}
func ({{ $receiver }} *{{ $builder }}) sqlExist(ctx context.Context) (bool, error) {
n, err := {{ $receiver }}.sqlCount(ctx)
if err != nil {
return false, fmt.Errorf("{{ $pkg }}: check existence: %v", err)
}
return n > 0, nil
}
func ({{ $receiver }} *{{ $builder }}) sqlQuery() *sql.Selector {
builder := sql.Dialect({{ $receiver }}.driver.Dialect())
t1 := builder.Table({{ $.Package }}.Table)
selector := builder.Select(t1.Columns({{ $.Package }}.Columns...)...).From(t1)
if {{ $receiver }}.sql != nil {
selector = {{ $receiver }}.sql
selector.Select(selector.Columns({{ $.Package }}.Columns...)...)
}
for _, p := range {{ $receiver }}.predicates {
p(selector)
}
for _, p := range {{ $receiver }}.order {
p(selector)
}
if offset := {{ $receiver }}.offset; offset != nil {
// limit is mandatory for offset clause. We start
// with default value, and override it below if needed.
selector.Offset(*offset).Limit(math.MaxInt32)
}
if limit := {{ $receiver }}.limit; limit != nil {
selector.Limit(*limit)
}
return selector
}
{{ end }}
{{/* query/path defines the query generation for path of a given edge. */}}
{{ define "dialect/sql/query/path" }}
{{- $n := $ }} {{/* the node we start the query from. */}}
{{- $e := $.Scope.Edge }} {{/* the edge we need to genegrate the path to. */}}
{{- $receiver := $.Scope.Receiver }}
step := sqlgraph.NewStep(
sqlgraph.From({{ $n.Package }}.Table, {{ $n.Package }}.{{ $n.ID.Constant }}, {{ $receiver }}.sqlQuery()),
sqlgraph.To({{ $e.Type.Package }}.Table, {{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}),
sqlgraph.Edge(sqlgraph.{{ $e.Rel.Type }}, {{ $e.IsInverse }}, {{ $n.Package }}.{{ $e.TableConstant }},
{{- if $e.M2M -}}
{{ $n.Package }}.{{ $e.PKConstant }}...
{{- else -}}
{{ $n.Package }}.{{ $e.ColumnConstant }}
{{- end -}}
),
)
query.sql = sqlgraph.SetNeighbors({{ $receiver }}.driver.Dialect(), step)
{{ end }}
{{/* query/from defines the query generation for an edge query from a given node. */}}
{{ define "dialect/sql/query/from" }}
{{- $n := $ }} {{/* the node we start the query from. */}}
{{- $e := $.Scope.Edge }} {{/* the edge we need to genegrate the path to. */}}
{{- $receiver := $.Scope.Receiver -}}
id := {{ $receiver }}.{{- if $n.ID.IsString }}id(){{ else }}ID{{ end }}
step := sqlgraph.NewStep(
sqlgraph.From({{ $n.Package }}.Table, {{ $n.Package }}.{{ $n.ID.Constant }}, id),
sqlgraph.To({{ $e.Type.Package }}.Table, {{ $e.Type.Package }}.{{ $e.Type.ID.Constant }}),
sqlgraph.Edge(sqlgraph.{{ $e.Rel.Type }}, {{ $e.IsInverse }}, {{ $n.Package }}.{{ $e.TableConstant }},
{{- if $e.M2M -}}
{{ $n.Package }}.{{ $e.PKConstant }}...
{{- else -}}
{{ $n.Package }}.{{ $e.ColumnConstant }}
{{- end -}}
),
)
query.sql = sqlgraph.Neighbors({{ $receiver }}.driver.Dialect(), step)
{{ end }}