Files
ent/entc/integration/ent/spec_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

468 lines
12 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/card"
"entgo.io/ent/entc/integration/ent/spec"
"entgo.io/ent/schema/field"
)
// SpecCreate is the builder for creating a Spec entity.
type SpecCreate struct {
config
mutation *SpecMutation
hooks []Hook
conflict []sql.ConflictOption
}
// AddCardIDs adds the "card" edge to the Card entity by IDs.
func (sc *SpecCreate) AddCardIDs(ids ...int) *SpecCreate {
sc.mutation.AddCardIDs(ids...)
return sc
}
// AddCard adds the "card" edges to the Card entity.
func (sc *SpecCreate) AddCard(c ...*Card) *SpecCreate {
ids := make([]int, len(c))
for i := range c {
ids[i] = c[i].ID
}
return sc.AddCardIDs(ids...)
}
// Mutation returns the SpecMutation object of the builder.
func (sc *SpecCreate) Mutation() *SpecMutation {
return sc.mutation
}
// Save creates the Spec in the database.
func (sc *SpecCreate) Save(ctx context.Context) (*Spec, error) {
var (
err error
node *Spec
)
if len(sc.hooks) == 0 {
if err = sc.check(); err != nil {
return nil, err
}
node, err = sc.sqlSave(ctx)
} else {
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*SpecMutation)
if !ok {
return nil, fmt.Errorf("unexpected mutation type %T", m)
}
if err = sc.check(); err != nil {
return nil, err
}
sc.mutation = mutation
if node, err = sc.sqlSave(ctx); err != nil {
return nil, err
}
mutation.id = &node.ID
mutation.done = true
return node, err
})
for i := len(sc.hooks) - 1; i >= 0; i-- {
if sc.hooks[i] == nil {
return nil, fmt.Errorf("ent: uninitialized hook (forgotten import ent/runtime?)")
}
mut = sc.hooks[i](mut)
}
if _, err := mut.Mutate(ctx, sc.mutation); err != nil {
return nil, err
}
}
return node, err
}
// SaveX calls Save and panics if Save returns an error.
func (sc *SpecCreate) SaveX(ctx context.Context) *Spec {
v, err := sc.Save(ctx)
if err != nil {
panic(err)
}
return v
}
// Exec executes the query.
func (sc *SpecCreate) Exec(ctx context.Context) error {
_, err := sc.Save(ctx)
return err
}
// ExecX is like Exec, but panics if an error occurs.
func (sc *SpecCreate) ExecX(ctx context.Context) {
if err := sc.Exec(ctx); err != nil {
panic(err)
}
}
// check runs all checks and user-defined validators on the builder.
func (sc *SpecCreate) check() error {
return nil
}
func (sc *SpecCreate) sqlSave(ctx context.Context) (*Spec, error) {
_node, _spec := sc.createSpec()
if err := sqlgraph.CreateNode(ctx, sc.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 (sc *SpecCreate) createSpec() (*Spec, *sqlgraph.CreateSpec) {
var (
_node = &Spec{config: sc.config}
_spec = &sqlgraph.CreateSpec{
Table: spec.Table,
ID: &sqlgraph.FieldSpec{
Type: field.TypeInt,
Column: spec.FieldID,
},
}
)
_spec.OnConflict = sc.conflict
if nodes := sc.mutation.CardIDs(); len(nodes) > 0 {
edge := &sqlgraph.EdgeSpec{
Rel: sqlgraph.M2M,
Inverse: false,
Table: spec.CardTable,
Columns: spec.CardPrimaryKey,
Bidi: false,
Target: &sqlgraph.EdgeTarget{
IDSpec: &sqlgraph.FieldSpec{
Type: field.TypeInt,
Column: card.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.Spec.Create().
// OnConflict(
// // Update the row with the new values
// // the was proposed for insertion.
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (sc *SpecCreate) OnConflict(opts ...sql.ConflictOption) *SpecUpsertOne {
sc.conflict = opts
return &SpecUpsertOne{
create: sc,
}
}
// OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using:
//
// client.Spec.Create().
// OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx)
//
func (sc *SpecCreate) OnConflictColumns(columns ...string) *SpecUpsertOne {
sc.conflict = append(sc.conflict, sql.ConflictColumns(columns...))
return &SpecUpsertOne{
create: sc,
}
}
type (
// SpecUpsertOne is the builder for "upsert"-ing
// one Spec node.
SpecUpsertOne struct {
create *SpecCreate
}
// SpecUpsert is the "OnConflict" setter.
SpecUpsert struct {
*sql.UpdateSet
}
)
// UpdateNewValues updates the mutable fields using the new values that were set on create.
// Using this option is equivalent to using:
//
// client.Spec.Create().
// OnConflict(
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (u *SpecUpsertOne) UpdateNewValues() *SpecUpsertOne {
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.Spec.Create().
// OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx)
//
func (u *SpecUpsertOne) Ignore() *SpecUpsertOne {
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 *SpecUpsertOne) DoNothing() *SpecUpsertOne {
u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u
}
// Update allows overriding fields `UPDATE` values. See the SpecCreate.OnConflict
// documentation for more info.
func (u *SpecUpsertOne) Update(set func(*SpecUpsert)) *SpecUpsertOne {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&SpecUpsert{UpdateSet: update})
}))
return u
}
// Exec executes the query.
func (u *SpecUpsertOne) Exec(ctx context.Context) error {
if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for SpecCreate.OnConflict")
}
return u.create.Exec(ctx)
}
// ExecX is like Exec, but panics if an error occurs.
func (u *SpecUpsertOne) 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 *SpecUpsertOne) 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 *SpecUpsertOne) IDX(ctx context.Context) int {
id, err := u.ID(ctx)
if err != nil {
panic(err)
}
return id
}
// SpecCreateBulk is the builder for creating many Spec entities in bulk.
type SpecCreateBulk struct {
config
builders []*SpecCreate
conflict []sql.ConflictOption
}
// Save creates the Spec entities in the database.
func (scb *SpecCreateBulk) Save(ctx context.Context) ([]*Spec, error) {
specs := make([]*sqlgraph.CreateSpec, len(scb.builders))
nodes := make([]*Spec, len(scb.builders))
mutators := make([]Mutator, len(scb.builders))
for i := range scb.builders {
func(i int, root context.Context) {
builder := scb.builders[i]
var mut Mutator = MutateFunc(func(ctx context.Context, m Mutation) (Value, error) {
mutation, ok := m.(*SpecMutation)
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, scb.builders[i+1].mutation)
} else {
spec := &sqlgraph.BatchCreateSpec{Nodes: specs}
spec.OnConflict = scb.conflict
// Invoke the actual operation on the latest mutation in the chain.
if err = sqlgraph.BatchCreate(ctx, scb.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, scb.builders[0].mutation); err != nil {
return nil, err
}
}
return nodes, nil
}
// SaveX is like Save, but panics if an error occurs.
func (scb *SpecCreateBulk) SaveX(ctx context.Context) []*Spec {
v, err := scb.Save(ctx)
if err != nil {
panic(err)
}
return v
}
// Exec executes the query.
func (scb *SpecCreateBulk) Exec(ctx context.Context) error {
_, err := scb.Save(ctx)
return err
}
// ExecX is like Exec, but panics if an error occurs.
func (scb *SpecCreateBulk) ExecX(ctx context.Context) {
if err := scb.Exec(ctx); err != nil {
panic(err)
}
}
// OnConflict allows configuring the `ON CONFLICT` / `ON DUPLICATE KEY` clause
// of the `INSERT` statement. For example:
//
// client.Spec.CreateBulk(builders...).
// OnConflict(
// // Update the row with the new values
// // the was proposed for insertion.
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (scb *SpecCreateBulk) OnConflict(opts ...sql.ConflictOption) *SpecUpsertBulk {
scb.conflict = opts
return &SpecUpsertBulk{
create: scb,
}
}
// OnConflictColumns calls `OnConflict` and configures the columns
// as conflict target. Using this option is equivalent to using:
//
// client.Spec.Create().
// OnConflict(sql.ConflictColumns(columns...)).
// Exec(ctx)
//
func (scb *SpecCreateBulk) OnConflictColumns(columns ...string) *SpecUpsertBulk {
scb.conflict = append(scb.conflict, sql.ConflictColumns(columns...))
return &SpecUpsertBulk{
create: scb,
}
}
// SpecUpsertBulk is the builder for "upsert"-ing
// a bulk of Spec nodes.
type SpecUpsertBulk struct {
create *SpecCreateBulk
}
// UpdateNewValues updates the mutable fields using the new values that
// were set on create. Using this option is equivalent to using:
//
// client.Spec.Create().
// OnConflict(
// sql.ResolveWithNewValues(),
// ).
// Exec(ctx)
//
func (u *SpecUpsertBulk) UpdateNewValues() *SpecUpsertBulk {
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.Spec.Create().
// OnConflict(sql.ResolveWithIgnore()).
// Exec(ctx)
//
func (u *SpecUpsertBulk) Ignore() *SpecUpsertBulk {
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 *SpecUpsertBulk) DoNothing() *SpecUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.DoNothing())
return u
}
// Update allows overriding fields `UPDATE` values. See the SpecCreateBulk.OnConflict
// documentation for more info.
func (u *SpecUpsertBulk) Update(set func(*SpecUpsert)) *SpecUpsertBulk {
u.create.conflict = append(u.create.conflict, sql.ResolveWith(func(update *sql.UpdateSet) {
set(&SpecUpsert{UpdateSet: update})
}))
return u
}
// Exec executes the query.
func (u *SpecUpsertBulk) 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 SpecCreateBulk instead", i)
}
}
if len(u.create.conflict) == 0 {
return errors.New("ent: missing options for SpecCreateBulk.OnConflict")
}
return u.create.Exec(ctx)
}
// ExecX is like Exec, but panics if an error occurs.
func (u *SpecUpsertBulk) ExecX(ctx context.Context) {
if err := u.create.Exec(ctx); err != nil {
panic(err)
}
}