mirror of
https://github.com/ent/ent.git
synced 2026-05-24 09:31:56 +03:00
Most queries are not graph traversals but rather regular table scans, in which case the DISTINCT clause is not needed as duplicates cannot be returned (unless query was modified by the user).
580 lines
16 KiB
Go
580 lines
16 KiB
Go
// 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.
|
|
|
|
// Code generated by ent, DO NOT EDIT.
|
|
|
|
package ent
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"math"
|
|
|
|
"entgo.io/ent/dialect"
|
|
"entgo.io/ent/dialect/sql"
|
|
"entgo.io/ent/dialect/sql/sqlgraph"
|
|
"entgo.io/ent/entc/integration/ent/license"
|
|
"entgo.io/ent/entc/integration/ent/predicate"
|
|
"entgo.io/ent/schema/field"
|
|
)
|
|
|
|
// LicenseQuery is the builder for querying License entities.
|
|
type LicenseQuery struct {
|
|
config
|
|
ctx *QueryContext
|
|
order []OrderFunc
|
|
inters []Interceptor
|
|
predicates []predicate.License
|
|
modifiers []func(*sql.Selector)
|
|
// intermediate query (i.e. traversal path).
|
|
sql *sql.Selector
|
|
path func(context.Context) (*sql.Selector, error)
|
|
}
|
|
|
|
// Where adds a new predicate for the LicenseQuery builder.
|
|
func (lq *LicenseQuery) Where(ps ...predicate.License) *LicenseQuery {
|
|
lq.predicates = append(lq.predicates, ps...)
|
|
return lq
|
|
}
|
|
|
|
// Limit the number of records to be returned by this query.
|
|
func (lq *LicenseQuery) Limit(limit int) *LicenseQuery {
|
|
lq.ctx.Limit = &limit
|
|
return lq
|
|
}
|
|
|
|
// Offset to start from.
|
|
func (lq *LicenseQuery) Offset(offset int) *LicenseQuery {
|
|
lq.ctx.Offset = &offset
|
|
return lq
|
|
}
|
|
|
|
// Unique configures the query builder to filter duplicate records on query.
|
|
// By default, unique is set to true, and can be disabled using this method.
|
|
func (lq *LicenseQuery) Unique(unique bool) *LicenseQuery {
|
|
lq.ctx.Unique = &unique
|
|
return lq
|
|
}
|
|
|
|
// Order specifies how the records should be ordered.
|
|
func (lq *LicenseQuery) Order(o ...OrderFunc) *LicenseQuery {
|
|
lq.order = append(lq.order, o...)
|
|
return lq
|
|
}
|
|
|
|
// First returns the first License entity from the query.
|
|
// Returns a *NotFoundError when no License was found.
|
|
func (lq *LicenseQuery) First(ctx context.Context) (*License, error) {
|
|
nodes, err := lq.Limit(1).All(setContextOp(ctx, lq.ctx, "First"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if len(nodes) == 0 {
|
|
return nil, &NotFoundError{license.Label}
|
|
}
|
|
return nodes[0], nil
|
|
}
|
|
|
|
// FirstX is like First, but panics if an error occurs.
|
|
func (lq *LicenseQuery) FirstX(ctx context.Context) *License {
|
|
node, err := lq.First(ctx)
|
|
if err != nil && !IsNotFound(err) {
|
|
panic(err)
|
|
}
|
|
return node
|
|
}
|
|
|
|
// FirstID returns the first License ID from the query.
|
|
// Returns a *NotFoundError when no License ID was found.
|
|
func (lq *LicenseQuery) FirstID(ctx context.Context) (id int, err error) {
|
|
var ids []int
|
|
if ids, err = lq.Limit(1).IDs(setContextOp(ctx, lq.ctx, "FirstID")); err != nil {
|
|
return
|
|
}
|
|
if len(ids) == 0 {
|
|
err = &NotFoundError{license.Label}
|
|
return
|
|
}
|
|
return ids[0], nil
|
|
}
|
|
|
|
// FirstIDX is like FirstID, but panics if an error occurs.
|
|
func (lq *LicenseQuery) FirstIDX(ctx context.Context) int {
|
|
id, err := lq.FirstID(ctx)
|
|
if err != nil && !IsNotFound(err) {
|
|
panic(err)
|
|
}
|
|
return id
|
|
}
|
|
|
|
// Only returns a single License entity found by the query, ensuring it only returns one.
|
|
// Returns a *NotSingularError when more than one License entity is found.
|
|
// Returns a *NotFoundError when no License entities are found.
|
|
func (lq *LicenseQuery) Only(ctx context.Context) (*License, error) {
|
|
nodes, err := lq.Limit(2).All(setContextOp(ctx, lq.ctx, "Only"))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
switch len(nodes) {
|
|
case 1:
|
|
return nodes[0], nil
|
|
case 0:
|
|
return nil, &NotFoundError{license.Label}
|
|
default:
|
|
return nil, &NotSingularError{license.Label}
|
|
}
|
|
}
|
|
|
|
// OnlyX is like Only, but panics if an error occurs.
|
|
func (lq *LicenseQuery) OnlyX(ctx context.Context) *License {
|
|
node, err := lq.Only(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return node
|
|
}
|
|
|
|
// OnlyID is like Only, but returns the only License ID in the query.
|
|
// Returns a *NotSingularError when more than one License ID is found.
|
|
// Returns a *NotFoundError when no entities are found.
|
|
func (lq *LicenseQuery) OnlyID(ctx context.Context) (id int, err error) {
|
|
var ids []int
|
|
if ids, err = lq.Limit(2).IDs(setContextOp(ctx, lq.ctx, "OnlyID")); err != nil {
|
|
return
|
|
}
|
|
switch len(ids) {
|
|
case 1:
|
|
id = ids[0]
|
|
case 0:
|
|
err = &NotFoundError{license.Label}
|
|
default:
|
|
err = &NotSingularError{license.Label}
|
|
}
|
|
return
|
|
}
|
|
|
|
// OnlyIDX is like OnlyID, but panics if an error occurs.
|
|
func (lq *LicenseQuery) OnlyIDX(ctx context.Context) int {
|
|
id, err := lq.OnlyID(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return id
|
|
}
|
|
|
|
// All executes the query and returns a list of Licenses.
|
|
func (lq *LicenseQuery) All(ctx context.Context) ([]*License, error) {
|
|
ctx = setContextOp(ctx, lq.ctx, "All")
|
|
if err := lq.prepareQuery(ctx); err != nil {
|
|
return nil, err
|
|
}
|
|
qr := querierAll[[]*License, *LicenseQuery]()
|
|
return withInterceptors[[]*License](ctx, lq, qr, lq.inters)
|
|
}
|
|
|
|
// AllX is like All, but panics if an error occurs.
|
|
func (lq *LicenseQuery) AllX(ctx context.Context) []*License {
|
|
nodes, err := lq.All(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return nodes
|
|
}
|
|
|
|
// IDs executes the query and returns a list of License IDs.
|
|
func (lq *LicenseQuery) IDs(ctx context.Context) (ids []int, err error) {
|
|
if lq.ctx.Unique == nil && lq.path != nil {
|
|
lq.Unique(true)
|
|
}
|
|
ctx = setContextOp(ctx, lq.ctx, "IDs")
|
|
if err = lq.Select(license.FieldID).Scan(ctx, &ids); err != nil {
|
|
return nil, err
|
|
}
|
|
return ids, nil
|
|
}
|
|
|
|
// IDsX is like IDs, but panics if an error occurs.
|
|
func (lq *LicenseQuery) IDsX(ctx context.Context) []int {
|
|
ids, err := lq.IDs(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return ids
|
|
}
|
|
|
|
// Count returns the count of the given query.
|
|
func (lq *LicenseQuery) Count(ctx context.Context) (int, error) {
|
|
ctx = setContextOp(ctx, lq.ctx, "Count")
|
|
if err := lq.prepareQuery(ctx); err != nil {
|
|
return 0, err
|
|
}
|
|
return withInterceptors[int](ctx, lq, querierCount[*LicenseQuery](), lq.inters)
|
|
}
|
|
|
|
// CountX is like Count, but panics if an error occurs.
|
|
func (lq *LicenseQuery) CountX(ctx context.Context) int {
|
|
count, err := lq.Count(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return count
|
|
}
|
|
|
|
// Exist returns true if the query has elements in the graph.
|
|
func (lq *LicenseQuery) Exist(ctx context.Context) (bool, error) {
|
|
ctx = setContextOp(ctx, lq.ctx, "Exist")
|
|
switch _, err := lq.FirstID(ctx); {
|
|
case IsNotFound(err):
|
|
return false, nil
|
|
case err != nil:
|
|
return false, fmt.Errorf("ent: check existence: %w", err)
|
|
default:
|
|
return true, nil
|
|
}
|
|
}
|
|
|
|
// ExistX is like Exist, but panics if an error occurs.
|
|
func (lq *LicenseQuery) ExistX(ctx context.Context) bool {
|
|
exist, err := lq.Exist(ctx)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return exist
|
|
}
|
|
|
|
// Clone returns a duplicate of the LicenseQuery builder, including all associated steps. It can be
|
|
// used to prepare common query builders and use them differently after the clone is made.
|
|
func (lq *LicenseQuery) Clone() *LicenseQuery {
|
|
if lq == nil {
|
|
return nil
|
|
}
|
|
return &LicenseQuery{
|
|
config: lq.config,
|
|
ctx: lq.ctx.Clone(),
|
|
order: append([]OrderFunc{}, lq.order...),
|
|
inters: append([]Interceptor{}, lq.inters...),
|
|
predicates: append([]predicate.License{}, lq.predicates...),
|
|
// clone intermediate query.
|
|
sql: lq.sql.Clone(),
|
|
path: lq.path,
|
|
}
|
|
}
|
|
|
|
// GroupBy is used to group vertices by one or more fields/columns.
|
|
// It is often used with aggregate functions, like: count, max, mean, min, sum.
|
|
//
|
|
// Example:
|
|
//
|
|
// var v []struct {
|
|
// CreateTime time.Time `json:"create_time,omitempty"`
|
|
// Count int `json:"count,omitempty"`
|
|
// }
|
|
//
|
|
// client.License.Query().
|
|
// GroupBy(license.FieldCreateTime).
|
|
// Aggregate(ent.Count()).
|
|
// Scan(ctx, &v)
|
|
func (lq *LicenseQuery) GroupBy(field string, fields ...string) *LicenseGroupBy {
|
|
lq.ctx.Fields = append([]string{field}, fields...)
|
|
grbuild := &LicenseGroupBy{build: lq}
|
|
grbuild.flds = &lq.ctx.Fields
|
|
grbuild.label = license.Label
|
|
grbuild.scan = grbuild.Scan
|
|
return grbuild
|
|
}
|
|
|
|
// Select allows the selection one or more fields/columns for the given query,
|
|
// instead of selecting all fields in the entity.
|
|
//
|
|
// Example:
|
|
//
|
|
// var v []struct {
|
|
// CreateTime time.Time `json:"create_time,omitempty"`
|
|
// }
|
|
//
|
|
// client.License.Query().
|
|
// Select(license.FieldCreateTime).
|
|
// Scan(ctx, &v)
|
|
func (lq *LicenseQuery) Select(fields ...string) *LicenseSelect {
|
|
lq.ctx.Fields = append(lq.ctx.Fields, fields...)
|
|
sbuild := &LicenseSelect{LicenseQuery: lq}
|
|
sbuild.label = license.Label
|
|
sbuild.flds, sbuild.scan = &lq.ctx.Fields, sbuild.Scan
|
|
return sbuild
|
|
}
|
|
|
|
// Aggregate returns a LicenseSelect configured with the given aggregations.
|
|
func (lq *LicenseQuery) Aggregate(fns ...AggregateFunc) *LicenseSelect {
|
|
return lq.Select().Aggregate(fns...)
|
|
}
|
|
|
|
func (lq *LicenseQuery) prepareQuery(ctx context.Context) error {
|
|
for _, inter := range lq.inters {
|
|
if inter == nil {
|
|
return fmt.Errorf("ent: uninitialized interceptor (forgotten import ent/runtime?)")
|
|
}
|
|
if trv, ok := inter.(Traverser); ok {
|
|
if err := trv.Traverse(ctx, lq); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
for _, f := range lq.ctx.Fields {
|
|
if !license.ValidColumn(f) {
|
|
return &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)}
|
|
}
|
|
}
|
|
if lq.path != nil {
|
|
prev, err := lq.path(ctx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
lq.sql = prev
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (lq *LicenseQuery) sqlAll(ctx context.Context, hooks ...queryHook) ([]*License, error) {
|
|
var (
|
|
nodes = []*License{}
|
|
_spec = lq.querySpec()
|
|
)
|
|
_spec.ScanValues = func(columns []string) ([]any, error) {
|
|
return (*License).scanValues(nil, columns)
|
|
}
|
|
_spec.Assign = func(columns []string, values []any) error {
|
|
node := &License{config: lq.config}
|
|
nodes = append(nodes, node)
|
|
return node.assignValues(columns, values)
|
|
}
|
|
if len(lq.modifiers) > 0 {
|
|
_spec.Modifiers = lq.modifiers
|
|
}
|
|
for i := range hooks {
|
|
hooks[i](ctx, _spec)
|
|
}
|
|
if err := sqlgraph.QueryNodes(ctx, lq.driver, _spec); err != nil {
|
|
return nil, err
|
|
}
|
|
if len(nodes) == 0 {
|
|
return nodes, nil
|
|
}
|
|
return nodes, nil
|
|
}
|
|
|
|
func (lq *LicenseQuery) sqlCount(ctx context.Context) (int, error) {
|
|
_spec := lq.querySpec()
|
|
if len(lq.modifiers) > 0 {
|
|
_spec.Modifiers = lq.modifiers
|
|
}
|
|
_spec.Node.Columns = lq.ctx.Fields
|
|
if len(lq.ctx.Fields) > 0 {
|
|
_spec.Unique = lq.ctx.Unique != nil && *lq.ctx.Unique
|
|
}
|
|
return sqlgraph.CountNodes(ctx, lq.driver, _spec)
|
|
}
|
|
|
|
func (lq *LicenseQuery) querySpec() *sqlgraph.QuerySpec {
|
|
_spec := sqlgraph.NewQuerySpec(license.Table, license.Columns, sqlgraph.NewFieldSpec(license.FieldID, field.TypeInt))
|
|
_spec.From = lq.sql
|
|
if unique := lq.ctx.Unique; unique != nil {
|
|
_spec.Unique = *unique
|
|
} else if lq.path != nil {
|
|
_spec.Unique = true
|
|
}
|
|
if fields := lq.ctx.Fields; len(fields) > 0 {
|
|
_spec.Node.Columns = make([]string, 0, len(fields))
|
|
_spec.Node.Columns = append(_spec.Node.Columns, license.FieldID)
|
|
for i := range fields {
|
|
if fields[i] != license.FieldID {
|
|
_spec.Node.Columns = append(_spec.Node.Columns, fields[i])
|
|
}
|
|
}
|
|
}
|
|
if ps := lq.predicates; len(ps) > 0 {
|
|
_spec.Predicate = func(selector *sql.Selector) {
|
|
for i := range ps {
|
|
ps[i](selector)
|
|
}
|
|
}
|
|
}
|
|
if limit := lq.ctx.Limit; limit != nil {
|
|
_spec.Limit = *limit
|
|
}
|
|
if offset := lq.ctx.Offset; offset != nil {
|
|
_spec.Offset = *offset
|
|
}
|
|
if ps := lq.order; len(ps) > 0 {
|
|
_spec.Order = func(selector *sql.Selector) {
|
|
for i := range ps {
|
|
ps[i](selector)
|
|
}
|
|
}
|
|
}
|
|
return _spec
|
|
}
|
|
|
|
func (lq *LicenseQuery) sqlQuery(ctx context.Context) *sql.Selector {
|
|
builder := sql.Dialect(lq.driver.Dialect())
|
|
t1 := builder.Table(license.Table)
|
|
columns := lq.ctx.Fields
|
|
if len(columns) == 0 {
|
|
columns = license.Columns
|
|
}
|
|
selector := builder.Select(t1.Columns(columns...)...).From(t1)
|
|
if lq.sql != nil {
|
|
selector = lq.sql
|
|
selector.Select(selector.Columns(columns...)...)
|
|
}
|
|
if lq.ctx.Unique != nil && *lq.ctx.Unique {
|
|
selector.Distinct()
|
|
}
|
|
for _, m := range lq.modifiers {
|
|
m(selector)
|
|
}
|
|
for _, p := range lq.predicates {
|
|
p(selector)
|
|
}
|
|
for _, p := range lq.order {
|
|
p(selector)
|
|
}
|
|
if offset := lq.ctx.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 := lq.ctx.Limit; limit != nil {
|
|
selector.Limit(*limit)
|
|
}
|
|
return selector
|
|
}
|
|
|
|
// 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
|
|
// either committed or rolled-back.
|
|
func (lq *LicenseQuery) ForUpdate(opts ...sql.LockOption) *LicenseQuery {
|
|
if lq.driver.Dialect() == dialect.Postgres {
|
|
lq.Unique(false)
|
|
}
|
|
lq.modifiers = append(lq.modifiers, func(s *sql.Selector) {
|
|
s.ForUpdate(opts...)
|
|
})
|
|
return lq
|
|
}
|
|
|
|
// ForShare behaves similarly to ForUpdate, except that it acquires a shared mode lock
|
|
// on any rows that are read. Other sessions can read the rows, but cannot modify them
|
|
// until your transaction commits.
|
|
func (lq *LicenseQuery) ForShare(opts ...sql.LockOption) *LicenseQuery {
|
|
if lq.driver.Dialect() == dialect.Postgres {
|
|
lq.Unique(false)
|
|
}
|
|
lq.modifiers = append(lq.modifiers, func(s *sql.Selector) {
|
|
s.ForShare(opts...)
|
|
})
|
|
return lq
|
|
}
|
|
|
|
// Modify adds a query modifier for attaching custom logic to queries.
|
|
func (lq *LicenseQuery) Modify(modifiers ...func(s *sql.Selector)) *LicenseSelect {
|
|
lq.modifiers = append(lq.modifiers, modifiers...)
|
|
return lq.Select()
|
|
}
|
|
|
|
// LicenseGroupBy is the group-by builder for License entities.
|
|
type LicenseGroupBy struct {
|
|
selector
|
|
build *LicenseQuery
|
|
}
|
|
|
|
// Aggregate adds the given aggregation functions to the group-by query.
|
|
func (lgb *LicenseGroupBy) Aggregate(fns ...AggregateFunc) *LicenseGroupBy {
|
|
lgb.fns = append(lgb.fns, fns...)
|
|
return lgb
|
|
}
|
|
|
|
// Scan applies the selector query and scans the result into the given value.
|
|
func (lgb *LicenseGroupBy) Scan(ctx context.Context, v any) error {
|
|
ctx = setContextOp(ctx, lgb.build.ctx, "GroupBy")
|
|
if err := lgb.build.prepareQuery(ctx); err != nil {
|
|
return err
|
|
}
|
|
return scanWithInterceptors[*LicenseQuery, *LicenseGroupBy](ctx, lgb.build, lgb, lgb.build.inters, v)
|
|
}
|
|
|
|
func (lgb *LicenseGroupBy) sqlScan(ctx context.Context, root *LicenseQuery, v any) error {
|
|
selector := root.sqlQuery(ctx).Select()
|
|
aggregation := make([]string, 0, len(lgb.fns))
|
|
for _, fn := range lgb.fns {
|
|
aggregation = append(aggregation, fn(selector))
|
|
}
|
|
if len(selector.SelectedColumns()) == 0 {
|
|
columns := make([]string, 0, len(*lgb.flds)+len(lgb.fns))
|
|
for _, f := range *lgb.flds {
|
|
columns = append(columns, selector.C(f))
|
|
}
|
|
columns = append(columns, aggregation...)
|
|
selector.Select(columns...)
|
|
}
|
|
selector.GroupBy(selector.Columns(*lgb.flds...)...)
|
|
if err := selector.Err(); err != nil {
|
|
return err
|
|
}
|
|
rows := &sql.Rows{}
|
|
query, args := selector.Query()
|
|
if err := lgb.build.driver.Query(ctx, query, args, rows); err != nil {
|
|
return err
|
|
}
|
|
defer rows.Close()
|
|
return sql.ScanSlice(rows, v)
|
|
}
|
|
|
|
// LicenseSelect is the builder for selecting fields of License entities.
|
|
type LicenseSelect struct {
|
|
*LicenseQuery
|
|
selector
|
|
}
|
|
|
|
// Aggregate adds the given aggregation functions to the selector query.
|
|
func (ls *LicenseSelect) Aggregate(fns ...AggregateFunc) *LicenseSelect {
|
|
ls.fns = append(ls.fns, fns...)
|
|
return ls
|
|
}
|
|
|
|
// Scan applies the selector query and scans the result into the given value.
|
|
func (ls *LicenseSelect) Scan(ctx context.Context, v any) error {
|
|
ctx = setContextOp(ctx, ls.ctx, "Select")
|
|
if err := ls.prepareQuery(ctx); err != nil {
|
|
return err
|
|
}
|
|
return scanWithInterceptors[*LicenseQuery, *LicenseSelect](ctx, ls.LicenseQuery, ls, ls.inters, v)
|
|
}
|
|
|
|
func (ls *LicenseSelect) sqlScan(ctx context.Context, root *LicenseQuery, v any) error {
|
|
selector := root.sqlQuery(ctx)
|
|
aggregation := make([]string, 0, len(ls.fns))
|
|
for _, fn := range ls.fns {
|
|
aggregation = append(aggregation, fn(selector))
|
|
}
|
|
switch n := len(*ls.selector.flds); {
|
|
case n == 0 && len(aggregation) > 0:
|
|
selector.Select(aggregation...)
|
|
case n != 0 && len(aggregation) > 0:
|
|
selector.AppendSelect(aggregation...)
|
|
}
|
|
rows := &sql.Rows{}
|
|
query, args := selector.Query()
|
|
if err := ls.driver.Query(ctx, query, args, rows); err != nil {
|
|
return err
|
|
}
|
|
defer rows.Close()
|
|
return sql.ScanSlice(rows, v)
|
|
}
|
|
|
|
// Modify adds a query modifier for attaching custom logic to queries.
|
|
func (ls *LicenseSelect) Modify(modifiers ...func(s *sql.Selector)) *LicenseSelect {
|
|
ls.modifiers = append(ls.modifiers, modifiers...)
|
|
return ls
|
|
}
|