{{/* 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) { var ( nodes []*{{ $.Name }} spec = {{ $receiver }}.querySpec() ) spec.ScanValues = func() []interface{} { node := &{{ $.Name }}{config: {{ $receiver }}.config} nodes = append(nodes, node) return node.scanValues() } spec.Assign = func(values ...interface{}) error { if len(nodes) == 0 { return fmt.Errorf("{{ $pkg }}: Assign called without calling ScanValues") } node := nodes[len(nodes)-1] return node.assignValues(values...) } if err := sqlgraph.QueryNodes(ctx, {{ $receiver }}.driver, spec); err != nil { return nil, err } return nodes, nil } func ({{ $receiver }} *{{ $builder }}) sqlCount(ctx context.Context) (int, error) { spec := {{ $receiver }}.querySpec() 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 }}) querySpec() *sqlgraph.QuerySpec { spec := &sqlgraph.QuerySpec{ Node: &sqlgraph.NodeSpec{ Table: {{ $.Package }}.Table, Columns: {{ $.Package }}.Columns, 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 spec } 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 }}