Files
ent/entc/integration/ent/node_create.go
Ariel Mashraki 9e809635b2 entc/gen: ignore immutable fields on Upsert<T>.UpdateNewValues
Also, for some reason, the TimeMixin.UpdateTime was an immutable field,
but this was incorrent, because the codegen just skip generating
update setters to it. Removing the Immutable modifier allows users
to set this field explicitly.
2021-10-08 08:20:05 +03:00

623 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 entc, DO NOT EDIT.
package ent
import (
"context"
"errors"
"fmt"
"entgo.io/ent/dialect/sql"
"entgo.io/ent/dialect/sql/sqlgraph"
"entgo.io/ent/entc/integration/ent/node"
"entgo.io/ent/schema/field"
)
// NodeCreate is the builder for creating a Node entity.
type NodeCreate struct {
config
mutation *NodeMutation
hooks []Hook
conflict []sql.ConflictOption
}
// SetValue sets the "value" field.
func (nc *NodeCreate) SetValue(i int) *NodeCreate {
nc.mutation.SetValue(i)
return nc
}
// SetNillableValue sets the "value" field if the given value is not nil.
func (nc *NodeCreate) SetNillableValue(i *int) *NodeCreate {
if i != nil {
nc.SetValue(*i)
}
return nc
}
// SetPrevID sets the "prev" edge to the Node entity by ID.
func (nc *NodeCreate) SetPrevID(id int) *NodeCreate {
nc.mutation.SetPrevID(id)
return nc
}
// SetNillablePrevID sets the "prev" edge to the Node entity by ID if the given value is not nil.
func (nc *NodeCreate) SetNillablePrevID(id *int) *NodeCreate {
if id != nil {
nc = nc.SetPrevID(*id)
}
return nc
}
// SetPrev sets the "prev" edge to the Node entity.
func (nc *NodeCreate) SetPrev(n *Node) *NodeCreate {
return nc.SetPrevID(n.ID)
}
// SetNextID sets the "next" edge to the Node entity by ID.
func (nc *NodeCreate) SetNextID(id int) *NodeCreate {
nc.mutation.SetNextID(id)
return nc
}
// SetNillableNextID sets the "next" edge to the Node entity by ID if the given value is not nil.
func (nc *NodeCreate) SetNillableNextID(id *int) *NodeCreate {
if id != nil {
nc = nc.SetNextID(*id)
}
return nc
}
// SetNext sets the "next" edge to the Node entity.
func (nc *NodeCreate) SetNext(n *Node) *NodeCreate {
return nc.SetNextID(n.ID)
}
// Mutation returns the NodeMutation object of the builder.
func (nc *NodeCreate) Mutation() *NodeMutation {
return nc.mutation
}
// Save creates the Node in the database.
func (nc *NodeCreate) Save(ctx context.Context) (*Node, error) {
var (
err error
node *Node
)
if len(nc.hooks) == 0 {
if err = nc.check(); err != nil {
return nil, err
}
node, err = nc.sqlSave(ctx)
} else {
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*NodeMutation)
if !ok {
return nil, fmt.Errorf("unexpected mutation type %T", m)
}
if err = nc.check(); err != nil {
return nil, err
}
nc.mutation = mutation
if node, err = nc.sqlSave(ctx); err != nil {
return nil, err
}
mutation.id = &node.ID
mutation.done = true
return node, err
})
for i := len(nc.hooks) - 1; i >= 0; i-- {
if nc.hooks[i] == nil {
return nil, fmt.Errorf("ent: uninitialized hook (forgotten import ent/runtime?)")
}
mut = nc.hooks[i](mut)
}
if _, err := mut.Mutate(ctx, nc.mutation); err != nil {
return nil, err
}
}
return node, err
}
// SaveX calls Save and panics if Save returns an error.
func (nc *NodeCreate) SaveX(ctx context.Context) *Node {
v, err := nc.Save(ctx)
if err != nil {
panic(err)
}
return v
}
// Exec executes the query.
func (nc *NodeCreate) Exec(ctx context.Context) error {
_, err := nc.Save(ctx)
return err
}
// ExecX is like Exec, but panics if an error occurs.
func (nc *NodeCreate) ExecX(ctx context.Context) {
if err := nc.Exec(ctx); err != nil {
panic(err)
}
}
// check runs all checks and user-defined validators on the builder.
func (nc *NodeCreate) check() error {
return nil
}
func (nc *NodeCreate) sqlSave(ctx context.Context) (*Node, error) {
_node, _spec := nc.createSpec()
if err := sqlgraph.CreateNode(ctx, nc.driver, _spec); err != nil {
if sqlgraph.IsConstraintError(err) {
err = &ConstraintError{err.Error(), err}
}
return nil, err
}
id := _spec.ID.Value.(int64)
_node.ID = int(id)
return _node, nil
}
func (nc *NodeCreate) createSpec() (*Node, *sqlgraph.CreateSpec) {
var (
_node = &Node{config: nc.config}
_spec = &sqlgraph.CreateSpec{
Table: node.Table,
ID: &sqlgraph.FieldSpec{
Type: field.TypeInt,
Column: node.FieldID,
},
}
)
_spec.OnConflict = nc.conflict
if value, ok := nc.mutation.Value(); ok {
_spec.Fields = append(_spec.Fields, &sqlgraph.FieldSpec{
Type: field.TypeInt,
Value: value,
Column: node.FieldValue,
})
_node.Value = value
}
if nodes := nc.mutation.PrevIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2O,
Inverse: true,
Table: node.PrevTable,
Columns: []string{node.PrevColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: &sqlgraph.FieldSpec{
Type: field.TypeInt,
Column: node.FieldID,
},
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_node.node_next = &nodes[0]
_spec.Edges = append(_spec.Edges, edge)
}
if nodes := nc.mutation.NextIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.O2O,
Inverse: false,
Table: node.NextTable,
Columns: []string{node.NextColumn},
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: &sqlgraph.FieldSpec{
Type: field.TypeInt,
Column: node.FieldID,
},
},
}
for _, k := range nodes {
edge.Target.Nodes = append(edge.Target.Nodes, k)
}
_spec.Edges = append(_spec.Edges, edge)
}
return _node, _spec
}
// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause
// of the `INSERT` statement. For example:
//
// client.Node.Create().
// SetValue(v).
// OnConflict(
// // Update the row with the new values
// // the was proposed for insertion.
// sql.ResolveWithNewValues(),
// ).
// // Override some of the fields with custom
// // update values.
// Update(func(u *ent.NodeUpsert) {
// SetValue(v+v).
// }).
// Exec(ctx)
//
func (nc *NodeCreate) OnConflict(opts ...sql.ConflictOption) *NodeUpsertOne {
nc.conflict = opts
return &NodeUpsertOne{
create: nc,
}
}
// OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx)
//
func (nc *NodeCreate) OnConflictColumns(columns ...string) *NodeUpsertOne {
nc.conflict = append(nc.conflict, sql.ConflictColumns(columns...))
return &NodeUpsertOne{
create: nc,
}
}
type (
// NodeUpsertOne is the builder for "upsert"-ing
// one Node node.
NodeUpsertOne struct {
create *NodeCreate
}
// NodeUpsert is the "OnConflict" setter.
NodeUpsert struct {
*sql.UpdateSet
}
)
// SetValue sets the "value" field.
func (u *NodeUpsert) SetValue(v int) *NodeUpsert {
u.Set(node.FieldValue, v)
return u
}
// UpdateValue sets the "value" field to the value that was provided on create.
func (u *NodeUpsert) UpdateValue() *NodeUpsert {
u.SetExcluded(node.FieldValue)
return u
}
// AddValue adds v to the "value" field.
func (u *NodeUpsert) AddValue(v int) *NodeUpsert {
u.Add(node.FieldValue, v)
return u
}
// ClearValue clears the value of the "value" field.
func (u *NodeUpsert) ClearValue() *NodeUpsert {
u.SetNull(node.FieldValue)
return u
}
// UpdateNewValues updates the mutable fields using the new values that were set on create.
// Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (u *NodeUpsertOne) UpdateNewValues() *NodeUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues())
return u
}
// Ignore sets each column to itself in case of conflict.
// Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx)
//
func (u *NodeUpsertOne) Ignore() *NodeUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore())
return u
}
// DoNothing configures the conflict_action to `DO NOTHING`.
// Supported only by SQLite and PostgreSQL.
func (u *NodeUpsertOne) DoNothing() *NodeUpsertOne {
u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u
}
// Update allows overriding fields `UPDATE` values. See the NodeCreate.OnConflict
// documentation for more info.
func (u *NodeUpsertOne) Update(set func(*NodeUpsert)) *NodeUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&NodeUpsert{UpdateSet: update})
}))
return u
}
// SetValue sets the "value" field.
func (u *NodeUpsertOne) SetValue(v int) *NodeUpsertOne {
return u.Update(func(s *NodeUpsert) {
s.SetValue(v)
})
}
// AddValue adds v to the "value" field.
func (u *NodeUpsertOne) AddValue(v int) *NodeUpsertOne {
return u.Update(func(s *NodeUpsert) {
s.AddValue(v)
})
}
// UpdateValue sets the "value" field to the value that was provided on create.
func (u *NodeUpsertOne) UpdateValue() *NodeUpsertOne {
return u.Update(func(s *NodeUpsert) {
s.UpdateValue()
})
}
// ClearValue clears the value of the "value" field.
func (u *NodeUpsertOne) ClearValue() *NodeUpsertOne {
return u.Update(func(s *NodeUpsert) {
s.ClearValue()
})
}
// Exec executes the query.
func (u *NodeUpsertOne) Exec(ctx context.Context) error {
if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for NodeCreate.OnConflict")
}
return u.create.Exec(ctx)
}
// ExecX is like Exec, but panics if an error occurs.
func (u *NodeUpsertOne) ExecX(ctx context.Context) {
if err := u.create.Exec(ctx); err != nil {
panic(err)
}
}
// Exec executes the UPSERT query and returns the inserted/updated ID.
func (u *NodeUpsertOne) ID(ctx context.Context) (id int, err error) {
node, err := u.create.Save(ctx)
if err != nil {
return id, err
}
return node.ID, nil
}
// IDX is like ID, but panics if an error occurs.
func (u *NodeUpsertOne) IDX(ctx context.Context) int {
id, err := u.ID(ctx)
if err != nil {
panic(err)
}
return id
}
// NodeCreateBulk is the builder for creating many Node entities in bulk.
type NodeCreateBulk struct {
config
builders []*NodeCreate
conflict []sql.ConflictOption
}
// Save creates the Node entities in the database.
func (ncb *NodeCreateBulk) Save(ctx context.Context) ([]*Node, error) {
specs := make([]*sqlgraph.CreateSpec, len(ncb.builders))
nodes := make([]*Node, len(ncb.builders))
mutators := make([]Mutator, len(ncb.builders))
for i := range ncb.builders {
func(i int, root context.Context) {
builder := ncb.builders[i]
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*NodeMutation)
if !ok {
return nil, fmt.Errorf("unexpected mutation type %T", m)
}
if err := builder.check(); err != nil {
return nil, err
}
builder.mutation = mutation
nodes[i], specs[i] = builder.createSpec()
var err error
if i < len(mutators)-1 {
_, err = mutators[i+1].Mutate(root, ncb.builders[i+1].mutation)
} else {
spec := &sqlgraph.BatchCreateSpec{Nodes: specs}
spec.OnConflict = ncb.conflict
// Invoke the actual operation on the latest mutation in the chain.
if err = sqlgraph.BatchCreate(ctx, ncb.driver, spec); err != nil {
if sqlgraph.IsConstraintError(err) {
err = &ConstraintError{err.Error(), err}
}
}
}
if err != nil {
return nil, err
}
mutation.id = &nodes[i].ID
mutation.done = true
if specs[i].ID.Value != nil {
id := specs[i].ID.Value.(int64)
nodes[i].ID = int(id)
}
return nodes[i], nil
})
for i := len(builder.hooks) - 1; i >= 0; i-- {
mut = builder.hooks[i](mut)
}
mutators[i] = mut
}(i, ctx)
}
if len(mutators) > 0 {
if _, err := mutators[0].Mutate(ctx, ncb.builders[0].mutation); err != nil {
return nil, err
}
}
return nodes, nil
}
// SaveX is like Save, but panics if an error occurs.
func (ncb *NodeCreateBulk) SaveX(ctx context.Context) []*Node {
v, err := ncb.Save(ctx)
if err != nil {
panic(err)
}
return v
}
// Exec executes the query.
func (ncb *NodeCreateBulk) Exec(ctx context.Context) error {
_, err := ncb.Save(ctx)
return err
}
// ExecX is like Exec, but panics if an error occurs.
func (ncb *NodeCreateBulk) ExecX(ctx context.Context) {
if err := ncb.Exec(ctx); err != nil {
panic(err)
}
}
// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause
// of the `INSERT` statement. For example:
//
// client.Node.CreateBulk(builders...).
// OnConflict(
// // Update the row with the new values
// // the was proposed for insertion.
// sql.ResolveWithNewValues(),
// ).
// // Override some of the fields with custom
// // update values.
// Update(func(u *ent.NodeUpsert) {
// SetValue(v+v).
// }).
// Exec(ctx)
//
func (ncb *NodeCreateBulk) OnConflict(opts ...sql.ConflictOption) *NodeUpsertBulk {
ncb.conflict = opts
return &NodeUpsertBulk{
create: ncb,
}
}
// OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx)
//
func (ncb *NodeCreateBulk) OnConflictColumns(columns ...string) *NodeUpsertBulk {
ncb.conflict = append(ncb.conflict, sql.ConflictColumns(columns...))
return &NodeUpsertBulk{
create: ncb,
}
}
// NodeUpsertBulk is the builder for "upsert"-ing
// a bulk of Node nodes.
type NodeUpsertBulk struct {
create *NodeCreateBulk
}
// UpdateNewValues updates the mutable fields using the new values that
// were set on create. Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (u *NodeUpsertBulk) UpdateNewValues() *NodeUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWithNewValues())
return u
}
// Ignore sets each column to itself in case of conflict.
// Using this option is equivalent to using:
//
// client.Node.Create().
// OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx)
//
func (u *NodeUpsertBulk) Ignore() *NodeUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWithIgnore())
return u
}
// DoNothing configures the conflict_action to `DO NOTHING`.
// Supported only by SQLite and PostgreSQL.
func (u *NodeUpsertBulk) DoNothing() *NodeUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u
}
// Update allows overriding fields `UPDATE` values. See the NodeCreateBulk.OnConflict
// documentation for more info.
func (u *NodeUpsertBulk) Update(set func(*NodeUpsert)) *NodeUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&NodeUpsert{UpdateSet: update})
}))
return u
}
// SetValue sets the "value" field.
func (u *NodeUpsertBulk) SetValue(v int) *NodeUpsertBulk {
return u.Update(func(s *NodeUpsert) {
s.SetValue(v)
})
}
// AddValue adds v to the "value" field.
func (u *NodeUpsertBulk) AddValue(v int) *NodeUpsertBulk {
return u.Update(func(s *NodeUpsert) {
s.AddValue(v)
})
}
// UpdateValue sets the "value" field to the value that was provided on create.
func (u *NodeUpsertBulk) UpdateValue() *NodeUpsertBulk {
return u.Update(func(s *NodeUpsert) {
s.UpdateValue()
})
}
// ClearValue clears the value of the "value" field.
func (u *NodeUpsertBulk) ClearValue() *NodeUpsertBulk {
return u.Update(func(s *NodeUpsert) {
s.ClearValue()
})
}
// Exec executes the query.
func (u *NodeUpsertBulk) Exec(ctx context.Context) error {
for i, b := range u.create.builders {
if len(b.conflict) != 0 {
return fmt.Errorf("ent: OnConflict was set for builder %d. Set it on the NodeCreateBulk instead", i)
}
}
if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for NodeCreateBulk.OnConflict")
}
return u.create.Exec(ctx)
}
// ExecX is like Exec, but panics if an error occurs.
func (u *NodeUpsertBulk) ExecX(ctx context.Context) {
if err := u.create.Exec(ctx); err != nil {
panic(err)
}
}