github.com/ngocphuongnb/tetua@v0.0.7-alpha/packages/entrepository/ent/file_query.go (about)

     1  // Code generated by entc, DO NOT EDIT.
     2  
     3  package ent
     4  
     5  import (
     6  	"context"
     7  	"database/sql/driver"
     8  	"errors"
     9  	"fmt"
    10  	"math"
    11  
    12  	"entgo.io/ent/dialect/sql"
    13  	"entgo.io/ent/dialect/sql/sqlgraph"
    14  	"entgo.io/ent/schema/field"
    15  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/file"
    16  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/page"
    17  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/post"
    18  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/predicate"
    19  	"github.com/ngocphuongnb/tetua/packages/entrepository/ent/user"
    20  )
    21  
    22  // FileQuery is the builder for querying File entities.
    23  type FileQuery struct {
    24  	config
    25  	limit      *int
    26  	offset     *int
    27  	unique     *bool
    28  	order      []OrderFunc
    29  	fields     []string
    30  	predicates []predicate.File
    31  	// eager-loading edges.
    32  	withUser        *UserQuery
    33  	withPosts       *PostQuery
    34  	withPages       *PageQuery
    35  	withUserAvatars *UserQuery
    36  	// intermediate query (i.e. traversal path).
    37  	sql  *sql.Selector
    38  	path func(context.Context) (*sql.Selector, error)
    39  }
    40  
    41  // Where adds a new predicate for the FileQuery builder.
    42  func (fq *FileQuery) Where(ps ...predicate.File) *FileQuery {
    43  	fq.predicates = append(fq.predicates, ps...)
    44  	return fq
    45  }
    46  
    47  // Limit adds a limit step to the query.
    48  func (fq *FileQuery) Limit(limit int) *FileQuery {
    49  	fq.limit = &limit
    50  	return fq
    51  }
    52  
    53  // Offset adds an offset step to the query.
    54  func (fq *FileQuery) Offset(offset int) *FileQuery {
    55  	fq.offset = &offset
    56  	return fq
    57  }
    58  
    59  // Unique configures the query builder to filter duplicate records on query.
    60  // By default, unique is set to true, and can be disabled using this method.
    61  func (fq *FileQuery) Unique(unique bool) *FileQuery {
    62  	fq.unique = &unique
    63  	return fq
    64  }
    65  
    66  // Order adds an order step to the query.
    67  func (fq *FileQuery) Order(o ...OrderFunc) *FileQuery {
    68  	fq.order = append(fq.order, o...)
    69  	return fq
    70  }
    71  
    72  // QueryUser chains the current query on the "user" edge.
    73  func (fq *FileQuery) QueryUser() *UserQuery {
    74  	query := &UserQuery{config: fq.config}
    75  	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
    76  		if err := fq.prepareQuery(ctx); err != nil {
    77  			return nil, err
    78  		}
    79  		selector := fq.sqlQuery(ctx)
    80  		if err := selector.Err(); err != nil {
    81  			return nil, err
    82  		}
    83  		step := sqlgraph.NewStep(
    84  			sqlgraph.From(file.Table, file.FieldID, selector),
    85  			sqlgraph.To(user.Table, user.FieldID),
    86  			sqlgraph.Edge(sqlgraph.M2O, true, file.UserTable, file.UserColumn),
    87  		)
    88  		fromU = sqlgraph.SetNeighbors(fq.driver.Dialect(), step)
    89  		return fromU, nil
    90  	}
    91  	return query
    92  }
    93  
    94  // QueryPosts chains the current query on the "posts" edge.
    95  func (fq *FileQuery) QueryPosts() *PostQuery {
    96  	query := &PostQuery{config: fq.config}
    97  	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
    98  		if err := fq.prepareQuery(ctx); err != nil {
    99  			return nil, err
   100  		}
   101  		selector := fq.sqlQuery(ctx)
   102  		if err := selector.Err(); err != nil {
   103  			return nil, err
   104  		}
   105  		step := sqlgraph.NewStep(
   106  			sqlgraph.From(file.Table, file.FieldID, selector),
   107  			sqlgraph.To(post.Table, post.FieldID),
   108  			sqlgraph.Edge(sqlgraph.O2M, false, file.PostsTable, file.PostsColumn),
   109  		)
   110  		fromU = sqlgraph.SetNeighbors(fq.driver.Dialect(), step)
   111  		return fromU, nil
   112  	}
   113  	return query
   114  }
   115  
   116  // QueryPages chains the current query on the "pages" edge.
   117  func (fq *FileQuery) QueryPages() *PageQuery {
   118  	query := &PageQuery{config: fq.config}
   119  	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
   120  		if err := fq.prepareQuery(ctx); err != nil {
   121  			return nil, err
   122  		}
   123  		selector := fq.sqlQuery(ctx)
   124  		if err := selector.Err(); err != nil {
   125  			return nil, err
   126  		}
   127  		step := sqlgraph.NewStep(
   128  			sqlgraph.From(file.Table, file.FieldID, selector),
   129  			sqlgraph.To(page.Table, page.FieldID),
   130  			sqlgraph.Edge(sqlgraph.O2M, false, file.PagesTable, file.PagesColumn),
   131  		)
   132  		fromU = sqlgraph.SetNeighbors(fq.driver.Dialect(), step)
   133  		return fromU, nil
   134  	}
   135  	return query
   136  }
   137  
   138  // QueryUserAvatars chains the current query on the "user_avatars" edge.
   139  func (fq *FileQuery) QueryUserAvatars() *UserQuery {
   140  	query := &UserQuery{config: fq.config}
   141  	query.path = func(ctx context.Context) (fromU *sql.Selector, err error) {
   142  		if err := fq.prepareQuery(ctx); err != nil {
   143  			return nil, err
   144  		}
   145  		selector := fq.sqlQuery(ctx)
   146  		if err := selector.Err(); err != nil {
   147  			return nil, err
   148  		}
   149  		step := sqlgraph.NewStep(
   150  			sqlgraph.From(file.Table, file.FieldID, selector),
   151  			sqlgraph.To(user.Table, user.FieldID),
   152  			sqlgraph.Edge(sqlgraph.O2M, false, file.UserAvatarsTable, file.UserAvatarsColumn),
   153  		)
   154  		fromU = sqlgraph.SetNeighbors(fq.driver.Dialect(), step)
   155  		return fromU, nil
   156  	}
   157  	return query
   158  }
   159  
   160  // First returns the first File entity from the query.
   161  // Returns a *NotFoundError when no File was found.
   162  func (fq *FileQuery) First(ctx context.Context) (*File, error) {
   163  	nodes, err := fq.Limit(1).All(ctx)
   164  	if err != nil {
   165  		return nil, err
   166  	}
   167  	if len(nodes) == 0 {
   168  		return nil, &NotFoundError{file.Label}
   169  	}
   170  	return nodes[0], nil
   171  }
   172  
   173  // FirstX is like First, but panics if an error occurs.
   174  func (fq *FileQuery) FirstX(ctx context.Context) *File {
   175  	node, err := fq.First(ctx)
   176  	if err != nil && !IsNotFound(err) {
   177  		panic(err)
   178  	}
   179  	return node
   180  }
   181  
   182  // FirstID returns the first File ID from the query.
   183  // Returns a *NotFoundError when no File ID was found.
   184  func (fq *FileQuery) FirstID(ctx context.Context) (id int, err error) {
   185  	var ids []int
   186  	if ids, err = fq.Limit(1).IDs(ctx); err != nil {
   187  		return
   188  	}
   189  	if len(ids) == 0 {
   190  		err = &NotFoundError{file.Label}
   191  		return
   192  	}
   193  	return ids[0], nil
   194  }
   195  
   196  // FirstIDX is like FirstID, but panics if an error occurs.
   197  func (fq *FileQuery) FirstIDX(ctx context.Context) int {
   198  	id, err := fq.FirstID(ctx)
   199  	if err != nil && !IsNotFound(err) {
   200  		panic(err)
   201  	}
   202  	return id
   203  }
   204  
   205  // Only returns a single File entity found by the query, ensuring it only returns one.
   206  // Returns a *NotSingularError when more than one File entity is found.
   207  // Returns a *NotFoundError when no File entities are found.
   208  func (fq *FileQuery) Only(ctx context.Context) (*File, error) {
   209  	nodes, err := fq.Limit(2).All(ctx)
   210  	if err != nil {
   211  		return nil, err
   212  	}
   213  	switch len(nodes) {
   214  	case 1:
   215  		return nodes[0], nil
   216  	case 0:
   217  		return nil, &NotFoundError{file.Label}
   218  	default:
   219  		return nil, &NotSingularError{file.Label}
   220  	}
   221  }
   222  
   223  // OnlyX is like Only, but panics if an error occurs.
   224  func (fq *FileQuery) OnlyX(ctx context.Context) *File {
   225  	node, err := fq.Only(ctx)
   226  	if err != nil {
   227  		panic(err)
   228  	}
   229  	return node
   230  }
   231  
   232  // OnlyID is like Only, but returns the only File ID in the query.
   233  // Returns a *NotSingularError when more than one File ID is found.
   234  // Returns a *NotFoundError when no entities are found.
   235  func (fq *FileQuery) OnlyID(ctx context.Context) (id int, err error) {
   236  	var ids []int
   237  	if ids, err = fq.Limit(2).IDs(ctx); err != nil {
   238  		return
   239  	}
   240  	switch len(ids) {
   241  	case 1:
   242  		id = ids[0]
   243  	case 0:
   244  		err = &NotFoundError{file.Label}
   245  	default:
   246  		err = &NotSingularError{file.Label}
   247  	}
   248  	return
   249  }
   250  
   251  // OnlyIDX is like OnlyID, but panics if an error occurs.
   252  func (fq *FileQuery) OnlyIDX(ctx context.Context) int {
   253  	id, err := fq.OnlyID(ctx)
   254  	if err != nil {
   255  		panic(err)
   256  	}
   257  	return id
   258  }
   259  
   260  // All executes the query and returns a list of Files.
   261  func (fq *FileQuery) All(ctx context.Context) ([]*File, error) {
   262  	if err := fq.prepareQuery(ctx); err != nil {
   263  		return nil, err
   264  	}
   265  	return fq.sqlAll(ctx)
   266  }
   267  
   268  // AllX is like All, but panics if an error occurs.
   269  func (fq *FileQuery) AllX(ctx context.Context) []*File {
   270  	nodes, err := fq.All(ctx)
   271  	if err != nil {
   272  		panic(err)
   273  	}
   274  	return nodes
   275  }
   276  
   277  // IDs executes the query and returns a list of File IDs.
   278  func (fq *FileQuery) IDs(ctx context.Context) ([]int, error) {
   279  	var ids []int
   280  	if err := fq.Select(file.FieldID).Scan(ctx, &ids); err != nil {
   281  		return nil, err
   282  	}
   283  	return ids, nil
   284  }
   285  
   286  // IDsX is like IDs, but panics if an error occurs.
   287  func (fq *FileQuery) IDsX(ctx context.Context) []int {
   288  	ids, err := fq.IDs(ctx)
   289  	if err != nil {
   290  		panic(err)
   291  	}
   292  	return ids
   293  }
   294  
   295  // Count returns the count of the given query.
   296  func (fq *FileQuery) Count(ctx context.Context) (int, error) {
   297  	if err := fq.prepareQuery(ctx); err != nil {
   298  		return 0, err
   299  	}
   300  	return fq.sqlCount(ctx)
   301  }
   302  
   303  // CountX is like Count, but panics if an error occurs.
   304  func (fq *FileQuery) CountX(ctx context.Context) int {
   305  	count, err := fq.Count(ctx)
   306  	if err != nil {
   307  		panic(err)
   308  	}
   309  	return count
   310  }
   311  
   312  // Exist returns true if the query has elements in the graph.
   313  func (fq *FileQuery) Exist(ctx context.Context) (bool, error) {
   314  	if err := fq.prepareQuery(ctx); err != nil {
   315  		return false, err
   316  	}
   317  	return fq.sqlExist(ctx)
   318  }
   319  
   320  // ExistX is like Exist, but panics if an error occurs.
   321  func (fq *FileQuery) ExistX(ctx context.Context) bool {
   322  	exist, err := fq.Exist(ctx)
   323  	if err != nil {
   324  		panic(err)
   325  	}
   326  	return exist
   327  }
   328  
   329  // Clone returns a duplicate of the FileQuery builder, including all associated steps. It can be
   330  // used to prepare common query builders and use them differently after the clone is made.
   331  func (fq *FileQuery) Clone() *FileQuery {
   332  	if fq == nil {
   333  		return nil
   334  	}
   335  	return &FileQuery{
   336  		config:          fq.config,
   337  		limit:           fq.limit,
   338  		offset:          fq.offset,
   339  		order:           append([]OrderFunc{}, fq.order...),
   340  		predicates:      append([]predicate.File{}, fq.predicates...),
   341  		withUser:        fq.withUser.Clone(),
   342  		withPosts:       fq.withPosts.Clone(),
   343  		withPages:       fq.withPages.Clone(),
   344  		withUserAvatars: fq.withUserAvatars.Clone(),
   345  		// clone intermediate query.
   346  		sql:    fq.sql.Clone(),
   347  		path:   fq.path,
   348  		unique: fq.unique,
   349  	}
   350  }
   351  
   352  // WithUser tells the query-builder to eager-load the nodes that are connected to
   353  // the "user" edge. The optional arguments are used to configure the query builder of the edge.
   354  func (fq *FileQuery) WithUser(opts ...func(*UserQuery)) *FileQuery {
   355  	query := &UserQuery{config: fq.config}
   356  	for _, opt := range opts {
   357  		opt(query)
   358  	}
   359  	fq.withUser = query
   360  	return fq
   361  }
   362  
   363  // WithPosts tells the query-builder to eager-load the nodes that are connected to
   364  // the "posts" edge. The optional arguments are used to configure the query builder of the edge.
   365  func (fq *FileQuery) WithPosts(opts ...func(*PostQuery)) *FileQuery {
   366  	query := &PostQuery{config: fq.config}
   367  	for _, opt := range opts {
   368  		opt(query)
   369  	}
   370  	fq.withPosts = query
   371  	return fq
   372  }
   373  
   374  // WithPages tells the query-builder to eager-load the nodes that are connected to
   375  // the "pages" edge. The optional arguments are used to configure the query builder of the edge.
   376  func (fq *FileQuery) WithPages(opts ...func(*PageQuery)) *FileQuery {
   377  	query := &PageQuery{config: fq.config}
   378  	for _, opt := range opts {
   379  		opt(query)
   380  	}
   381  	fq.withPages = query
   382  	return fq
   383  }
   384  
   385  // WithUserAvatars tells the query-builder to eager-load the nodes that are connected to
   386  // the "user_avatars" edge. The optional arguments are used to configure the query builder of the edge.
   387  func (fq *FileQuery) WithUserAvatars(opts ...func(*UserQuery)) *FileQuery {
   388  	query := &UserQuery{config: fq.config}
   389  	for _, opt := range opts {
   390  		opt(query)
   391  	}
   392  	fq.withUserAvatars = query
   393  	return fq
   394  }
   395  
   396  // GroupBy is used to group vertices by one or more fields/columns.
   397  // It is often used with aggregate functions, like: count, max, mean, min, sum.
   398  //
   399  // Example:
   400  //
   401  //	var v []struct {
   402  //		CreatedAt time.Time `json:"omitempty"`
   403  //		Count int `json:"count,omitempty"`
   404  //	}
   405  //
   406  //	client.File.Query().
   407  //		GroupBy(file.FieldCreatedAt).
   408  //		Aggregate(ent.Count()).
   409  //		Scan(ctx, &v)
   410  //
   411  func (fq *FileQuery) GroupBy(field string, fields ...string) *FileGroupBy {
   412  	group := &FileGroupBy{config: fq.config}
   413  	group.fields = append([]string{field}, fields...)
   414  	group.path = func(ctx context.Context) (prev *sql.Selector, err error) {
   415  		if err := fq.prepareQuery(ctx); err != nil {
   416  			return nil, err
   417  		}
   418  		return fq.sqlQuery(ctx), nil
   419  	}
   420  	return group
   421  }
   422  
   423  // Select allows the selection one or more fields/columns for the given query,
   424  // instead of selecting all fields in the entity.
   425  //
   426  // Example:
   427  //
   428  //	var v []struct {
   429  //		CreatedAt time.Time `json:"omitempty"`
   430  //	}
   431  //
   432  //	client.File.Query().
   433  //		Select(file.FieldCreatedAt).
   434  //		Scan(ctx, &v)
   435  //
   436  func (fq *FileQuery) Select(fields ...string) *FileSelect {
   437  	fq.fields = append(fq.fields, fields...)
   438  	return &FileSelect{FileQuery: fq}
   439  }
   440  
   441  func (fq *FileQuery) prepareQuery(ctx context.Context) error {
   442  	for _, f := range fq.fields {
   443  		if !file.ValidColumn(f) {
   444  			return &ValidationError{Name: f, err: fmt.Errorf("ent: invalid field %q for query", f)}
   445  		}
   446  	}
   447  	if fq.path != nil {
   448  		prev, err := fq.path(ctx)
   449  		if err != nil {
   450  			return err
   451  		}
   452  		fq.sql = prev
   453  	}
   454  	return nil
   455  }
   456  
   457  func (fq *FileQuery) sqlAll(ctx context.Context) ([]*File, error) {
   458  	var (
   459  		nodes       = []*File{}
   460  		_spec       = fq.querySpec()
   461  		loadedTypes = [4]bool{
   462  			fq.withUser != nil,
   463  			fq.withPosts != nil,
   464  			fq.withPages != nil,
   465  			fq.withUserAvatars != nil,
   466  		}
   467  	)
   468  	_spec.ScanValues = func(columns []string) ([]interface{}, error) {
   469  		node := &File{config: fq.config}
   470  		nodes = append(nodes, node)
   471  		return node.scanValues(columns)
   472  	}
   473  	_spec.Assign = func(columns []string, values []interface{}) error {
   474  		if len(nodes) == 0 {
   475  			return fmt.Errorf("ent: Assign called without calling ScanValues")
   476  		}
   477  		node := nodes[len(nodes)-1]
   478  		node.Edges.loadedTypes = loadedTypes
   479  		return node.assignValues(columns, values)
   480  	}
   481  	if err := sqlgraph.QueryNodes(ctx, fq.driver, _spec); err != nil {
   482  		return nil, err
   483  	}
   484  	if len(nodes) == 0 {
   485  		return nodes, nil
   486  	}
   487  
   488  	if query := fq.withUser; query != nil {
   489  		ids := make([]int, 0, len(nodes))
   490  		nodeids := make(map[int][]*File)
   491  		for i := range nodes {
   492  			fk := nodes[i].UserID
   493  			if _, ok := nodeids[fk]; !ok {
   494  				ids = append(ids, fk)
   495  			}
   496  			nodeids[fk] = append(nodeids[fk], nodes[i])
   497  		}
   498  		query.Where(user.IDIn(ids...))
   499  		neighbors, err := query.All(ctx)
   500  		if err != nil {
   501  			return nil, err
   502  		}
   503  		for _, n := range neighbors {
   504  			nodes, ok := nodeids[n.ID]
   505  			if !ok {
   506  				return nil, fmt.Errorf(`unexpected foreign-key "user_id" returned %v`, n.ID)
   507  			}
   508  			for i := range nodes {
   509  				nodes[i].Edges.User = n
   510  			}
   511  		}
   512  	}
   513  
   514  	if query := fq.withPosts; query != nil {
   515  		fks := make([]driver.Value, 0, len(nodes))
   516  		nodeids := make(map[int]*File)
   517  		for i := range nodes {
   518  			fks = append(fks, nodes[i].ID)
   519  			nodeids[nodes[i].ID] = nodes[i]
   520  			nodes[i].Edges.Posts = []*Post{}
   521  		}
   522  		query.Where(predicate.Post(func(s *sql.Selector) {
   523  			s.Where(sql.InValues(file.PostsColumn, fks...))
   524  		}))
   525  		neighbors, err := query.All(ctx)
   526  		if err != nil {
   527  			return nil, err
   528  		}
   529  		for _, n := range neighbors {
   530  			fk := n.FeaturedImageID
   531  			node, ok := nodeids[fk]
   532  			if !ok {
   533  				return nil, fmt.Errorf(`unexpected foreign-key "featured_image_id" returned %v for node %v`, fk, n.ID)
   534  			}
   535  			node.Edges.Posts = append(node.Edges.Posts, n)
   536  		}
   537  	}
   538  
   539  	if query := fq.withPages; query != nil {
   540  		fks := make([]driver.Value, 0, len(nodes))
   541  		nodeids := make(map[int]*File)
   542  		for i := range nodes {
   543  			fks = append(fks, nodes[i].ID)
   544  			nodeids[nodes[i].ID] = nodes[i]
   545  			nodes[i].Edges.Pages = []*Page{}
   546  		}
   547  		query.Where(predicate.Page(func(s *sql.Selector) {
   548  			s.Where(sql.InValues(file.PagesColumn, fks...))
   549  		}))
   550  		neighbors, err := query.All(ctx)
   551  		if err != nil {
   552  			return nil, err
   553  		}
   554  		for _, n := range neighbors {
   555  			fk := n.FeaturedImageID
   556  			node, ok := nodeids[fk]
   557  			if !ok {
   558  				return nil, fmt.Errorf(`unexpected foreign-key "featured_image_id" returned %v for node %v`, fk, n.ID)
   559  			}
   560  			node.Edges.Pages = append(node.Edges.Pages, n)
   561  		}
   562  	}
   563  
   564  	if query := fq.withUserAvatars; query != nil {
   565  		fks := make([]driver.Value, 0, len(nodes))
   566  		nodeids := make(map[int]*File)
   567  		for i := range nodes {
   568  			fks = append(fks, nodes[i].ID)
   569  			nodeids[nodes[i].ID] = nodes[i]
   570  			nodes[i].Edges.UserAvatars = []*User{}
   571  		}
   572  		query.Where(predicate.User(func(s *sql.Selector) {
   573  			s.Where(sql.InValues(file.UserAvatarsColumn, fks...))
   574  		}))
   575  		neighbors, err := query.All(ctx)
   576  		if err != nil {
   577  			return nil, err
   578  		}
   579  		for _, n := range neighbors {
   580  			fk := n.AvatarImageID
   581  			node, ok := nodeids[fk]
   582  			if !ok {
   583  				return nil, fmt.Errorf(`unexpected foreign-key "avatar_image_id" returned %v for node %v`, fk, n.ID)
   584  			}
   585  			node.Edges.UserAvatars = append(node.Edges.UserAvatars, n)
   586  		}
   587  	}
   588  
   589  	return nodes, nil
   590  }
   591  
   592  func (fq *FileQuery) sqlCount(ctx context.Context) (int, error) {
   593  	_spec := fq.querySpec()
   594  	_spec.Node.Columns = fq.fields
   595  	if len(fq.fields) > 0 {
   596  		_spec.Unique = fq.unique != nil && *fq.unique
   597  	}
   598  	return sqlgraph.CountNodes(ctx, fq.driver, _spec)
   599  }
   600  
   601  func (fq *FileQuery) sqlExist(ctx context.Context) (bool, error) {
   602  	n, err := fq.sqlCount(ctx)
   603  	if err != nil {
   604  		return false, fmt.Errorf("ent: check existence: %w", err)
   605  	}
   606  	return n > 0, nil
   607  }
   608  
   609  func (fq *FileQuery) querySpec() *sqlgraph.QuerySpec {
   610  	_spec := &sqlgraph.QuerySpec{
   611  		Node: &sqlgraph.NodeSpec{
   612  			Table:   file.Table,
   613  			Columns: file.Columns,
   614  			ID: &sqlgraph.FieldSpec{
   615  				Type:   field.TypeInt,
   616  				Column: file.FieldID,
   617  			},
   618  		},
   619  		From:   fq.sql,
   620  		Unique: true,
   621  	}
   622  	if unique := fq.unique; unique != nil {
   623  		_spec.Unique = *unique
   624  	}
   625  	if fields := fq.fields; len(fields) > 0 {
   626  		_spec.Node.Columns = make([]string, 0, len(fields))
   627  		_spec.Node.Columns = append(_spec.Node.Columns, file.FieldID)
   628  		for i := range fields {
   629  			if fields[i] != file.FieldID {
   630  				_spec.Node.Columns = append(_spec.Node.Columns, fields[i])
   631  			}
   632  		}
   633  	}
   634  	if ps := fq.predicates; len(ps) > 0 {
   635  		_spec.Predicate = func(selector *sql.Selector) {
   636  			for i := range ps {
   637  				ps[i](selector)
   638  			}
   639  		}
   640  	}
   641  	if limit := fq.limit; limit != nil {
   642  		_spec.Limit = *limit
   643  	}
   644  	if offset := fq.offset; offset != nil {
   645  		_spec.Offset = *offset
   646  	}
   647  	if ps := fq.order; len(ps) > 0 {
   648  		_spec.Order = func(selector *sql.Selector) {
   649  			for i := range ps {
   650  				ps[i](selector)
   651  			}
   652  		}
   653  	}
   654  	return _spec
   655  }
   656  
   657  func (fq *FileQuery) sqlQuery(ctx context.Context) *sql.Selector {
   658  	builder := sql.Dialect(fq.driver.Dialect())
   659  	t1 := builder.Table(file.Table)
   660  	columns := fq.fields
   661  	if len(columns) == 0 {
   662  		columns = file.Columns
   663  	}
   664  	selector := builder.Select(t1.Columns(columns...)...).From(t1)
   665  	if fq.sql != nil {
   666  		selector = fq.sql
   667  		selector.Select(selector.Columns(columns...)...)
   668  	}
   669  	if fq.unique != nil && *fq.unique {
   670  		selector.Distinct()
   671  	}
   672  	for _, p := range fq.predicates {
   673  		p(selector)
   674  	}
   675  	for _, p := range fq.order {
   676  		p(selector)
   677  	}
   678  	if offset := fq.offset; offset != nil {
   679  		// limit is mandatory for offset clause. We start
   680  		// with default value, and override it below if needed.
   681  		selector.Offset(*offset).Limit(math.MaxInt32)
   682  	}
   683  	if limit := fq.limit; limit != nil {
   684  		selector.Limit(*limit)
   685  	}
   686  	return selector
   687  }
   688  
   689  // FileGroupBy is the group-by builder for File entities.
   690  type FileGroupBy struct {
   691  	config
   692  	fields []string
   693  	fns    []AggregateFunc
   694  	// intermediate query (i.e. traversal path).
   695  	sql  *sql.Selector
   696  	path func(context.Context) (*sql.Selector, error)
   697  }
   698  
   699  // Aggregate adds the given aggregation functions to the group-by query.
   700  func (fgb *FileGroupBy) Aggregate(fns ...AggregateFunc) *FileGroupBy {
   701  	fgb.fns = append(fgb.fns, fns...)
   702  	return fgb
   703  }
   704  
   705  // Scan applies the group-by query and scans the result into the given value.
   706  func (fgb *FileGroupBy) Scan(ctx context.Context, v interface{}) error {
   707  	query, err := fgb.path(ctx)
   708  	if err != nil {
   709  		return err
   710  	}
   711  	fgb.sql = query
   712  	return fgb.sqlScan(ctx, v)
   713  }
   714  
   715  // ScanX is like Scan, but panics if an error occurs.
   716  func (fgb *FileGroupBy) ScanX(ctx context.Context, v interface{}) {
   717  	if err := fgb.Scan(ctx, v); err != nil {
   718  		panic(err)
   719  	}
   720  }
   721  
   722  // Strings returns list of strings from group-by.
   723  // It is only allowed when executing a group-by query with one field.
   724  func (fgb *FileGroupBy) Strings(ctx context.Context) ([]string, error) {
   725  	if len(fgb.fields) > 1 {
   726  		return nil, errors.New("ent: FileGroupBy.Strings is not achievable when grouping more than 1 field")
   727  	}
   728  	var v []string
   729  	if err := fgb.Scan(ctx, &v); err != nil {
   730  		return nil, err
   731  	}
   732  	return v, nil
   733  }
   734  
   735  // StringsX is like Strings, but panics if an error occurs.
   736  func (fgb *FileGroupBy) StringsX(ctx context.Context) []string {
   737  	v, err := fgb.Strings(ctx)
   738  	if err != nil {
   739  		panic(err)
   740  	}
   741  	return v
   742  }
   743  
   744  // String returns a single string from a group-by query.
   745  // It is only allowed when executing a group-by query with one field.
   746  func (fgb *FileGroupBy) String(ctx context.Context) (_ string, err error) {
   747  	var v []string
   748  	if v, err = fgb.Strings(ctx); err != nil {
   749  		return
   750  	}
   751  	switch len(v) {
   752  	case 1:
   753  		return v[0], nil
   754  	case 0:
   755  		err = &NotFoundError{file.Label}
   756  	default:
   757  		err = fmt.Errorf("ent: FileGroupBy.Strings returned %d results when one was expected", len(v))
   758  	}
   759  	return
   760  }
   761  
   762  // StringX is like String, but panics if an error occurs.
   763  func (fgb *FileGroupBy) StringX(ctx context.Context) string {
   764  	v, err := fgb.String(ctx)
   765  	if err != nil {
   766  		panic(err)
   767  	}
   768  	return v
   769  }
   770  
   771  // Ints returns list of ints from group-by.
   772  // It is only allowed when executing a group-by query with one field.
   773  func (fgb *FileGroupBy) Ints(ctx context.Context) ([]int, error) {
   774  	if len(fgb.fields) > 1 {
   775  		return nil, errors.New("ent: FileGroupBy.Ints is not achievable when grouping more than 1 field")
   776  	}
   777  	var v []int
   778  	if err := fgb.Scan(ctx, &v); err != nil {
   779  		return nil, err
   780  	}
   781  	return v, nil
   782  }
   783  
   784  // IntsX is like Ints, but panics if an error occurs.
   785  func (fgb *FileGroupBy) IntsX(ctx context.Context) []int {
   786  	v, err := fgb.Ints(ctx)
   787  	if err != nil {
   788  		panic(err)
   789  	}
   790  	return v
   791  }
   792  
   793  // Int returns a single int from a group-by query.
   794  // It is only allowed when executing a group-by query with one field.
   795  func (fgb *FileGroupBy) Int(ctx context.Context) (_ int, err error) {
   796  	var v []int
   797  	if v, err = fgb.Ints(ctx); err != nil {
   798  		return
   799  	}
   800  	switch len(v) {
   801  	case 1:
   802  		return v[0], nil
   803  	case 0:
   804  		err = &NotFoundError{file.Label}
   805  	default:
   806  		err = fmt.Errorf("ent: FileGroupBy.Ints returned %d results when one was expected", len(v))
   807  	}
   808  	return
   809  }
   810  
   811  // IntX is like Int, but panics if an error occurs.
   812  func (fgb *FileGroupBy) IntX(ctx context.Context) int {
   813  	v, err := fgb.Int(ctx)
   814  	if err != nil {
   815  		panic(err)
   816  	}
   817  	return v
   818  }
   819  
   820  // Float64s returns list of float64s from group-by.
   821  // It is only allowed when executing a group-by query with one field.
   822  func (fgb *FileGroupBy) Float64s(ctx context.Context) ([]float64, error) {
   823  	if len(fgb.fields) > 1 {
   824  		return nil, errors.New("ent: FileGroupBy.Float64s is not achievable when grouping more than 1 field")
   825  	}
   826  	var v []float64
   827  	if err := fgb.Scan(ctx, &v); err != nil {
   828  		return nil, err
   829  	}
   830  	return v, nil
   831  }
   832  
   833  // Float64sX is like Float64s, but panics if an error occurs.
   834  func (fgb *FileGroupBy) Float64sX(ctx context.Context) []float64 {
   835  	v, err := fgb.Float64s(ctx)
   836  	if err != nil {
   837  		panic(err)
   838  	}
   839  	return v
   840  }
   841  
   842  // Float64 returns a single float64 from a group-by query.
   843  // It is only allowed when executing a group-by query with one field.
   844  func (fgb *FileGroupBy) Float64(ctx context.Context) (_ float64, err error) {
   845  	var v []float64
   846  	if v, err = fgb.Float64s(ctx); err != nil {
   847  		return
   848  	}
   849  	switch len(v) {
   850  	case 1:
   851  		return v[0], nil
   852  	case 0:
   853  		err = &NotFoundError{file.Label}
   854  	default:
   855  		err = fmt.Errorf("ent: FileGroupBy.Float64s returned %d results when one was expected", len(v))
   856  	}
   857  	return
   858  }
   859  
   860  // Float64X is like Float64, but panics if an error occurs.
   861  func (fgb *FileGroupBy) Float64X(ctx context.Context) float64 {
   862  	v, err := fgb.Float64(ctx)
   863  	if err != nil {
   864  		panic(err)
   865  	}
   866  	return v
   867  }
   868  
   869  // Bools returns list of bools from group-by.
   870  // It is only allowed when executing a group-by query with one field.
   871  func (fgb *FileGroupBy) Bools(ctx context.Context) ([]bool, error) {
   872  	if len(fgb.fields) > 1 {
   873  		return nil, errors.New("ent: FileGroupBy.Bools is not achievable when grouping more than 1 field")
   874  	}
   875  	var v []bool
   876  	if err := fgb.Scan(ctx, &v); err != nil {
   877  		return nil, err
   878  	}
   879  	return v, nil
   880  }
   881  
   882  // BoolsX is like Bools, but panics if an error occurs.
   883  func (fgb *FileGroupBy) BoolsX(ctx context.Context) []bool {
   884  	v, err := fgb.Bools(ctx)
   885  	if err != nil {
   886  		panic(err)
   887  	}
   888  	return v
   889  }
   890  
   891  // Bool returns a single bool from a group-by query.
   892  // It is only allowed when executing a group-by query with one field.
   893  func (fgb *FileGroupBy) Bool(ctx context.Context) (_ bool, err error) {
   894  	var v []bool
   895  	if v, err = fgb.Bools(ctx); err != nil {
   896  		return
   897  	}
   898  	switch len(v) {
   899  	case 1:
   900  		return v[0], nil
   901  	case 0:
   902  		err = &NotFoundError{file.Label}
   903  	default:
   904  		err = fmt.Errorf("ent: FileGroupBy.Bools returned %d results when one was expected", len(v))
   905  	}
   906  	return
   907  }
   908  
   909  // BoolX is like Bool, but panics if an error occurs.
   910  func (fgb *FileGroupBy) BoolX(ctx context.Context) bool {
   911  	v, err := fgb.Bool(ctx)
   912  	if err != nil {
   913  		panic(err)
   914  	}
   915  	return v
   916  }
   917  
   918  func (fgb *FileGroupBy) sqlScan(ctx context.Context, v interface{}) error {
   919  	for _, f := range fgb.fields {
   920  		if !file.ValidColumn(f) {
   921  			return &ValidationError{Name: f, err: fmt.Errorf("invalid field %q for group-by", f)}
   922  		}
   923  	}
   924  	selector := fgb.sqlQuery()
   925  	if err := selector.Err(); err != nil {
   926  		return err
   927  	}
   928  	rows := &sql.Rows{}
   929  	query, args := selector.Query()
   930  	if err := fgb.driver.Query(ctx, query, args, rows); err != nil {
   931  		return err
   932  	}
   933  	defer rows.Close()
   934  	return sql.ScanSlice(rows, v)
   935  }
   936  
   937  func (fgb *FileGroupBy) sqlQuery() *sql.Selector {
   938  	selector := fgb.sql.Select()
   939  	aggregation := make([]string, 0, len(fgb.fns))
   940  	for _, fn := range fgb.fns {
   941  		aggregation = append(aggregation, fn(selector))
   942  	}
   943  	// If no columns were selected in a custom aggregation function, the default
   944  	// selection is the fields used for "group-by", and the aggregation functions.
   945  	if len(selector.SelectedColumns()) == 0 {
   946  		columns := make([]string, 0, len(fgb.fields)+len(fgb.fns))
   947  		for _, f := range fgb.fields {
   948  			columns = append(columns, selector.C(f))
   949  		}
   950  		columns = append(columns, aggregation...)
   951  		selector.Select(columns...)
   952  	}
   953  	return selector.GroupBy(selector.Columns(fgb.fields...)...)
   954  }
   955  
   956  // FileSelect is the builder for selecting fields of File entities.
   957  type FileSelect struct {
   958  	*FileQuery
   959  	// intermediate query (i.e. traversal path).
   960  	sql *sql.Selector
   961  }
   962  
   963  // Scan applies the selector query and scans the result into the given value.
   964  func (fs *FileSelect) Scan(ctx context.Context, v interface{}) error {
   965  	if err := fs.prepareQuery(ctx); err != nil {
   966  		return err
   967  	}
   968  	fs.sql = fs.FileQuery.sqlQuery(ctx)
   969  	return fs.sqlScan(ctx, v)
   970  }
   971  
   972  // ScanX is like Scan, but panics if an error occurs.
   973  func (fs *FileSelect) ScanX(ctx context.Context, v interface{}) {
   974  	if err := fs.Scan(ctx, v); err != nil {
   975  		panic(err)
   976  	}
   977  }
   978  
   979  // Strings returns list of strings from a selector. It is only allowed when selecting one field.
   980  func (fs *FileSelect) Strings(ctx context.Context) ([]string, error) {
   981  	if len(fs.fields) > 1 {
   982  		return nil, errors.New("ent: FileSelect.Strings is not achievable when selecting more than 1 field")
   983  	}
   984  	var v []string
   985  	if err := fs.Scan(ctx, &v); err != nil {
   986  		return nil, err
   987  	}
   988  	return v, nil
   989  }
   990  
   991  // StringsX is like Strings, but panics if an error occurs.
   992  func (fs *FileSelect) StringsX(ctx context.Context) []string {
   993  	v, err := fs.Strings(ctx)
   994  	if err != nil {
   995  		panic(err)
   996  	}
   997  	return v
   998  }
   999  
  1000  // String returns a single string from a selector. It is only allowed when selecting one field.
  1001  func (fs *FileSelect) String(ctx context.Context) (_ string, err error) {
  1002  	var v []string
  1003  	if v, err = fs.Strings(ctx); err != nil {
  1004  		return
  1005  	}
  1006  	switch len(v) {
  1007  	case 1:
  1008  		return v[0], nil
  1009  	case 0:
  1010  		err = &NotFoundError{file.Label}
  1011  	default:
  1012  		err = fmt.Errorf("ent: FileSelect.Strings returned %d results when one was expected", len(v))
  1013  	}
  1014  	return
  1015  }
  1016  
  1017  // StringX is like String, but panics if an error occurs.
  1018  func (fs *FileSelect) StringX(ctx context.Context) string {
  1019  	v, err := fs.String(ctx)
  1020  	if err != nil {
  1021  		panic(err)
  1022  	}
  1023  	return v
  1024  }
  1025  
  1026  // Ints returns list of ints from a selector. It is only allowed when selecting one field.
  1027  func (fs *FileSelect) Ints(ctx context.Context) ([]int, error) {
  1028  	if len(fs.fields) > 1 {
  1029  		return nil, errors.New("ent: FileSelect.Ints is not achievable when selecting more than 1 field")
  1030  	}
  1031  	var v []int
  1032  	if err := fs.Scan(ctx, &v); err != nil {
  1033  		return nil, err
  1034  	}
  1035  	return v, nil
  1036  }
  1037  
  1038  // IntsX is like Ints, but panics if an error occurs.
  1039  func (fs *FileSelect) IntsX(ctx context.Context) []int {
  1040  	v, err := fs.Ints(ctx)
  1041  	if err != nil {
  1042  		panic(err)
  1043  	}
  1044  	return v
  1045  }
  1046  
  1047  // Int returns a single int from a selector. It is only allowed when selecting one field.
  1048  func (fs *FileSelect) Int(ctx context.Context) (_ int, err error) {
  1049  	var v []int
  1050  	if v, err = fs.Ints(ctx); err != nil {
  1051  		return
  1052  	}
  1053  	switch len(v) {
  1054  	case 1:
  1055  		return v[0], nil
  1056  	case 0:
  1057  		err = &NotFoundError{file.Label}
  1058  	default:
  1059  		err = fmt.Errorf("ent: FileSelect.Ints returned %d results when one was expected", len(v))
  1060  	}
  1061  	return
  1062  }
  1063  
  1064  // IntX is like Int, but panics if an error occurs.
  1065  func (fs *FileSelect) IntX(ctx context.Context) int {
  1066  	v, err := fs.Int(ctx)
  1067  	if err != nil {
  1068  		panic(err)
  1069  	}
  1070  	return v
  1071  }
  1072  
  1073  // Float64s returns list of float64s from a selector. It is only allowed when selecting one field.
  1074  func (fs *FileSelect) Float64s(ctx context.Context) ([]float64, error) {
  1075  	if len(fs.fields) > 1 {
  1076  		return nil, errors.New("ent: FileSelect.Float64s is not achievable when selecting more than 1 field")
  1077  	}
  1078  	var v []float64
  1079  	if err := fs.Scan(ctx, &v); err != nil {
  1080  		return nil, err
  1081  	}
  1082  	return v, nil
  1083  }
  1084  
  1085  // Float64sX is like Float64s, but panics if an error occurs.
  1086  func (fs *FileSelect) Float64sX(ctx context.Context) []float64 {
  1087  	v, err := fs.Float64s(ctx)
  1088  	if err != nil {
  1089  		panic(err)
  1090  	}
  1091  	return v
  1092  }
  1093  
  1094  // Float64 returns a single float64 from a selector. It is only allowed when selecting one field.
  1095  func (fs *FileSelect) Float64(ctx context.Context) (_ float64, err error) {
  1096  	var v []float64
  1097  	if v, err = fs.Float64s(ctx); err != nil {
  1098  		return
  1099  	}
  1100  	switch len(v) {
  1101  	case 1:
  1102  		return v[0], nil
  1103  	case 0:
  1104  		err = &NotFoundError{file.Label}
  1105  	default:
  1106  		err = fmt.Errorf("ent: FileSelect.Float64s returned %d results when one was expected", len(v))
  1107  	}
  1108  	return
  1109  }
  1110  
  1111  // Float64X is like Float64, but panics if an error occurs.
  1112  func (fs *FileSelect) Float64X(ctx context.Context) float64 {
  1113  	v, err := fs.Float64(ctx)
  1114  	if err != nil {
  1115  		panic(err)
  1116  	}
  1117  	return v
  1118  }
  1119  
  1120  // Bools returns list of bools from a selector. It is only allowed when selecting one field.
  1121  func (fs *FileSelect) Bools(ctx context.Context) ([]bool, error) {
  1122  	if len(fs.fields) > 1 {
  1123  		return nil, errors.New("ent: FileSelect.Bools is not achievable when selecting more than 1 field")
  1124  	}
  1125  	var v []bool
  1126  	if err := fs.Scan(ctx, &v); err != nil {
  1127  		return nil, err
  1128  	}
  1129  	return v, nil
  1130  }
  1131  
  1132  // BoolsX is like Bools, but panics if an error occurs.
  1133  func (fs *FileSelect) BoolsX(ctx context.Context) []bool {
  1134  	v, err := fs.Bools(ctx)
  1135  	if err != nil {
  1136  		panic(err)
  1137  	}
  1138  	return v
  1139  }
  1140  
  1141  // Bool returns a single bool from a selector. It is only allowed when selecting one field.
  1142  func (fs *FileSelect) Bool(ctx context.Context) (_ bool, err error) {
  1143  	var v []bool
  1144  	if v, err = fs.Bools(ctx); err != nil {
  1145  		return
  1146  	}
  1147  	switch len(v) {
  1148  	case 1:
  1149  		return v[0], nil
  1150  	case 0:
  1151  		err = &NotFoundError{file.Label}
  1152  	default:
  1153  		err = fmt.Errorf("ent: FileSelect.Bools returned %d results when one was expected", len(v))
  1154  	}
  1155  	return
  1156  }
  1157  
  1158  // BoolX is like Bool, but panics if an error occurs.
  1159  func (fs *FileSelect) BoolX(ctx context.Context) bool {
  1160  	v, err := fs.Bool(ctx)
  1161  	if err != nil {
  1162  		panic(err)
  1163  	}
  1164  	return v
  1165  }
  1166  
  1167  func (fs *FileSelect) sqlScan(ctx context.Context, v interface{}) error {
  1168  	rows := &sql.Rows{}
  1169  	query, args := fs.sql.Query()
  1170  	if err := fs.driver.Query(ctx, query, args, rows); err != nil {
  1171  		return err
  1172  	}
  1173  	defer rows.Close()
  1174  	return sql.ScanSlice(rows, v)
  1175  }