// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.

package dbgen

import (
	"context"

	"git.mstar.dev/mstar/linstrom/storage-new/models"
	"gorm.io/gorm"
	"gorm.io/gorm/clause"
	"gorm.io/gorm/schema"

	"gorm.io/gen"
	"gorm.io/gen/field"

	"gorm.io/plugin/dbresolver"
)

func newRole(db *gorm.DB, opts ...gen.DOOption) role {
	_role := role{}

	_role.roleDo.UseDB(db, opts...)
	_role.roleDo.UseModel(&models.Role{})

	tableName := _role.roleDo.TableName()
	_role.ALL = field.NewAsterisk(tableName)
	_role.ID = field.NewUint(tableName, "id")
	_role.CreatedAt = field.NewTime(tableName, "created_at")
	_role.UpdatedAt = field.NewTime(tableName, "updated_at")
	_role.DeletedAt = field.NewField(tableName, "deleted_at")
	_role.Name = field.NewString(tableName, "name")
	_role.Priority = field.NewUint32(tableName, "priority")
	_role.IsUserRole = field.NewBool(tableName, "is_user_role")
	_role.IsBuiltIn = field.NewBool(tableName, "is_built_in")
	_role.CanSendMedia = field.NewBool(tableName, "can_send_media")
	_role.CanSendCustomEmotes = field.NewBool(tableName, "can_send_custom_emotes")
	_role.CanSendCustomReactions = field.NewBool(tableName, "can_send_custom_reactions")
	_role.CanSendPublicNotes = field.NewBool(tableName, "can_send_public_notes")
	_role.CanSendLocalNotes = field.NewBool(tableName, "can_send_local_notes")
	_role.CanSendFollowerOnlyNotes = field.NewBool(tableName, "can_send_follower_only_notes")
	_role.CanSendPrivateNotes = field.NewBool(tableName, "can_send_private_notes")
	_role.CanSendReplies = field.NewBool(tableName, "can_send_replies")
	_role.CanQuote = field.NewBool(tableName, "can_quote")
	_role.CanBoost = field.NewBool(tableName, "can_boost")
	_role.CanIncludeLinks = field.NewBool(tableName, "can_include_links")
	_role.CanIncludeSurvey = field.NewBool(tableName, "can_include_survey")
	_role.CanFederateFedi = field.NewBool(tableName, "can_federate_fedi")
	_role.CanFederateBsky = field.NewBool(tableName, "can_federate_bsky")
	_role.CanChangeDisplayName = field.NewBool(tableName, "can_change_display_name")
	_role.CanSubmitReports = field.NewBool(tableName, "can_submit_reports")
	_role.CanLogin = field.NewBool(tableName, "can_login")
	_role.CanMentionOthers = field.NewBool(tableName, "can_mention_others")
	_role.HasMentionCountLimit = field.NewBool(tableName, "has_mention_count_limit")
	_role.MentionLimit = field.NewUint32(tableName, "mention_limit")
	_role.AutoNsfwMedia = field.NewBool(tableName, "auto_nsfw_media")
	_role.AutoCwPosts = field.NewBool(tableName, "auto_cw_posts")
	_role.AutoCwPostsText = field.NewString(tableName, "auto_cw_posts_text")
	_role.ScanCreatedPublicNotes = field.NewBool(tableName, "scan_created_public_notes")
	_role.ScanCreatedLocalNotes = field.NewBool(tableName, "scan_created_local_notes")
	_role.ScanCreatedFollowerOnlyNotes = field.NewBool(tableName, "scan_created_follower_only_notes")
	_role.ScanCreatedPrivateNotes = field.NewBool(tableName, "scan_created_private_notes")
	_role.DisallowInteractionsWith = field.NewField(tableName, "disallow_interactions_with")
	_role.WithholdNotesForManualApproval = field.NewBool(tableName, "withhold_notes_for_manual_approval")
	_role.WithholdNotesBasedOnRegex = field.NewBool(tableName, "withhold_notes_based_on_regex")
	_role.WithholdNotesRegexes = field.NewField(tableName, "withhold_notes_regexes")
	_role.FullAdmin = field.NewBool(tableName, "full_admin")
	_role.CanAffectOtherAdmins = field.NewBool(tableName, "can_affect_other_admins")
	_role.CanDeleteNotes = field.NewBool(tableName, "can_delete_notes")
	_role.CanConfirmWithheldNotes = field.NewBool(tableName, "can_confirm_withheld_notes")
	_role.CanAssignRoles = field.NewBool(tableName, "can_assign_roles")
	_role.CanSupressInteractionsBetweenUsers = field.NewBool(tableName, "can_supress_interactions_between_users")
	_role.CanOverwriteDisplayNames = field.NewBool(tableName, "can_overwrite_display_names")
	_role.CanManageCustomEmotes = field.NewBool(tableName, "can_manage_custom_emotes")
	_role.CanViewDeletedNotes = field.NewBool(tableName, "can_view_deleted_notes")
	_role.CanRecoverDeletedNotes = field.NewBool(tableName, "can_recover_deleted_notes")
	_role.CanManageAvatarDecorations = field.NewBool(tableName, "can_manage_avatar_decorations")
	_role.CanManageAds = field.NewBool(tableName, "can_manage_ads")
	_role.CanSendAnnouncements = field.NewBool(tableName, "can_send_announcements")
	_role.CanDeleteAccounts = field.NewBool(tableName, "can_delete_accounts")

	_role.fillFieldMap()

	return _role
}

type role struct {
	roleDo

	ALL                                field.Asterisk
	ID                                 field.Uint
	CreatedAt                          field.Time
	UpdatedAt                          field.Time
	DeletedAt                          field.Field
	Name                               field.String
	Priority                           field.Uint32
	IsUserRole                         field.Bool
	IsBuiltIn                          field.Bool
	CanSendMedia                       field.Bool
	CanSendCustomEmotes                field.Bool
	CanSendCustomReactions             field.Bool
	CanSendPublicNotes                 field.Bool
	CanSendLocalNotes                  field.Bool
	CanSendFollowerOnlyNotes           field.Bool
	CanSendPrivateNotes                field.Bool
	CanSendReplies                     field.Bool
	CanQuote                           field.Bool
	CanBoost                           field.Bool
	CanIncludeLinks                    field.Bool
	CanIncludeSurvey                   field.Bool
	CanFederateFedi                    field.Bool
	CanFederateBsky                    field.Bool
	CanChangeDisplayName               field.Bool
	CanSubmitReports                   field.Bool
	CanLogin                           field.Bool
	CanMentionOthers                   field.Bool
	HasMentionCountLimit               field.Bool
	MentionLimit                       field.Uint32
	AutoNsfwMedia                      field.Bool
	AutoCwPosts                        field.Bool
	AutoCwPostsText                    field.String
	ScanCreatedPublicNotes             field.Bool
	ScanCreatedLocalNotes              field.Bool
	ScanCreatedFollowerOnlyNotes       field.Bool
	ScanCreatedPrivateNotes            field.Bool
	DisallowInteractionsWith           field.Field
	WithholdNotesForManualApproval     field.Bool
	WithholdNotesBasedOnRegex          field.Bool
	WithholdNotesRegexes               field.Field
	FullAdmin                          field.Bool
	CanAffectOtherAdmins               field.Bool
	CanDeleteNotes                     field.Bool
	CanConfirmWithheldNotes            field.Bool
	CanAssignRoles                     field.Bool
	CanSupressInteractionsBetweenUsers field.Bool
	CanOverwriteDisplayNames           field.Bool
	CanManageCustomEmotes              field.Bool
	CanViewDeletedNotes                field.Bool
	CanRecoverDeletedNotes             field.Bool
	CanManageAvatarDecorations         field.Bool
	CanManageAds                       field.Bool
	CanSendAnnouncements               field.Bool
	CanDeleteAccounts                  field.Bool

	fieldMap map[string]field.Expr
}

func (r role) Table(newTableName string) *role {
	r.roleDo.UseTable(newTableName)
	return r.updateTableName(newTableName)
}

func (r role) As(alias string) *role {
	r.roleDo.DO = *(r.roleDo.As(alias).(*gen.DO))
	return r.updateTableName(alias)
}

func (r *role) updateTableName(table string) *role {
	r.ALL = field.NewAsterisk(table)
	r.ID = field.NewUint(table, "id")
	r.CreatedAt = field.NewTime(table, "created_at")
	r.UpdatedAt = field.NewTime(table, "updated_at")
	r.DeletedAt = field.NewField(table, "deleted_at")
	r.Name = field.NewString(table, "name")
	r.Priority = field.NewUint32(table, "priority")
	r.IsUserRole = field.NewBool(table, "is_user_role")
	r.IsBuiltIn = field.NewBool(table, "is_built_in")
	r.CanSendMedia = field.NewBool(table, "can_send_media")
	r.CanSendCustomEmotes = field.NewBool(table, "can_send_custom_emotes")
	r.CanSendCustomReactions = field.NewBool(table, "can_send_custom_reactions")
	r.CanSendPublicNotes = field.NewBool(table, "can_send_public_notes")
	r.CanSendLocalNotes = field.NewBool(table, "can_send_local_notes")
	r.CanSendFollowerOnlyNotes = field.NewBool(table, "can_send_follower_only_notes")
	r.CanSendPrivateNotes = field.NewBool(table, "can_send_private_notes")
	r.CanSendReplies = field.NewBool(table, "can_send_replies")
	r.CanQuote = field.NewBool(table, "can_quote")
	r.CanBoost = field.NewBool(table, "can_boost")
	r.CanIncludeLinks = field.NewBool(table, "can_include_links")
	r.CanIncludeSurvey = field.NewBool(table, "can_include_survey")
	r.CanFederateFedi = field.NewBool(table, "can_federate_fedi")
	r.CanFederateBsky = field.NewBool(table, "can_federate_bsky")
	r.CanChangeDisplayName = field.NewBool(table, "can_change_display_name")
	r.CanSubmitReports = field.NewBool(table, "can_submit_reports")
	r.CanLogin = field.NewBool(table, "can_login")
	r.CanMentionOthers = field.NewBool(table, "can_mention_others")
	r.HasMentionCountLimit = field.NewBool(table, "has_mention_count_limit")
	r.MentionLimit = field.NewUint32(table, "mention_limit")
	r.AutoNsfwMedia = field.NewBool(table, "auto_nsfw_media")
	r.AutoCwPosts = field.NewBool(table, "auto_cw_posts")
	r.AutoCwPostsText = field.NewString(table, "auto_cw_posts_text")
	r.ScanCreatedPublicNotes = field.NewBool(table, "scan_created_public_notes")
	r.ScanCreatedLocalNotes = field.NewBool(table, "scan_created_local_notes")
	r.ScanCreatedFollowerOnlyNotes = field.NewBool(table, "scan_created_follower_only_notes")
	r.ScanCreatedPrivateNotes = field.NewBool(table, "scan_created_private_notes")
	r.DisallowInteractionsWith = field.NewField(table, "disallow_interactions_with")
	r.WithholdNotesForManualApproval = field.NewBool(table, "withhold_notes_for_manual_approval")
	r.WithholdNotesBasedOnRegex = field.NewBool(table, "withhold_notes_based_on_regex")
	r.WithholdNotesRegexes = field.NewField(table, "withhold_notes_regexes")
	r.FullAdmin = field.NewBool(table, "full_admin")
	r.CanAffectOtherAdmins = field.NewBool(table, "can_affect_other_admins")
	r.CanDeleteNotes = field.NewBool(table, "can_delete_notes")
	r.CanConfirmWithheldNotes = field.NewBool(table, "can_confirm_withheld_notes")
	r.CanAssignRoles = field.NewBool(table, "can_assign_roles")
	r.CanSupressInteractionsBetweenUsers = field.NewBool(table, "can_supress_interactions_between_users")
	r.CanOverwriteDisplayNames = field.NewBool(table, "can_overwrite_display_names")
	r.CanManageCustomEmotes = field.NewBool(table, "can_manage_custom_emotes")
	r.CanViewDeletedNotes = field.NewBool(table, "can_view_deleted_notes")
	r.CanRecoverDeletedNotes = field.NewBool(table, "can_recover_deleted_notes")
	r.CanManageAvatarDecorations = field.NewBool(table, "can_manage_avatar_decorations")
	r.CanManageAds = field.NewBool(table, "can_manage_ads")
	r.CanSendAnnouncements = field.NewBool(table, "can_send_announcements")
	r.CanDeleteAccounts = field.NewBool(table, "can_delete_accounts")

	r.fillFieldMap()

	return r
}

func (r *role) GetFieldByName(fieldName string) (field.OrderExpr, bool) {
	_f, ok := r.fieldMap[fieldName]
	if !ok || _f == nil {
		return nil, false
	}
	_oe, ok := _f.(field.OrderExpr)
	return _oe, ok
}

func (r *role) fillFieldMap() {
	r.fieldMap = make(map[string]field.Expr, 53)
	r.fieldMap["id"] = r.ID
	r.fieldMap["created_at"] = r.CreatedAt
	r.fieldMap["updated_at"] = r.UpdatedAt
	r.fieldMap["deleted_at"] = r.DeletedAt
	r.fieldMap["name"] = r.Name
	r.fieldMap["priority"] = r.Priority
	r.fieldMap["is_user_role"] = r.IsUserRole
	r.fieldMap["is_built_in"] = r.IsBuiltIn
	r.fieldMap["can_send_media"] = r.CanSendMedia
	r.fieldMap["can_send_custom_emotes"] = r.CanSendCustomEmotes
	r.fieldMap["can_send_custom_reactions"] = r.CanSendCustomReactions
	r.fieldMap["can_send_public_notes"] = r.CanSendPublicNotes
	r.fieldMap["can_send_local_notes"] = r.CanSendLocalNotes
	r.fieldMap["can_send_follower_only_notes"] = r.CanSendFollowerOnlyNotes
	r.fieldMap["can_send_private_notes"] = r.CanSendPrivateNotes
	r.fieldMap["can_send_replies"] = r.CanSendReplies
	r.fieldMap["can_quote"] = r.CanQuote
	r.fieldMap["can_boost"] = r.CanBoost
	r.fieldMap["can_include_links"] = r.CanIncludeLinks
	r.fieldMap["can_include_survey"] = r.CanIncludeSurvey
	r.fieldMap["can_federate_fedi"] = r.CanFederateFedi
	r.fieldMap["can_federate_bsky"] = r.CanFederateBsky
	r.fieldMap["can_change_display_name"] = r.CanChangeDisplayName
	r.fieldMap["can_submit_reports"] = r.CanSubmitReports
	r.fieldMap["can_login"] = r.CanLogin
	r.fieldMap["can_mention_others"] = r.CanMentionOthers
	r.fieldMap["has_mention_count_limit"] = r.HasMentionCountLimit
	r.fieldMap["mention_limit"] = r.MentionLimit
	r.fieldMap["auto_nsfw_media"] = r.AutoNsfwMedia
	r.fieldMap["auto_cw_posts"] = r.AutoCwPosts
	r.fieldMap["auto_cw_posts_text"] = r.AutoCwPostsText
	r.fieldMap["scan_created_public_notes"] = r.ScanCreatedPublicNotes
	r.fieldMap["scan_created_local_notes"] = r.ScanCreatedLocalNotes
	r.fieldMap["scan_created_follower_only_notes"] = r.ScanCreatedFollowerOnlyNotes
	r.fieldMap["scan_created_private_notes"] = r.ScanCreatedPrivateNotes
	r.fieldMap["disallow_interactions_with"] = r.DisallowInteractionsWith
	r.fieldMap["withhold_notes_for_manual_approval"] = r.WithholdNotesForManualApproval
	r.fieldMap["withhold_notes_based_on_regex"] = r.WithholdNotesBasedOnRegex
	r.fieldMap["withhold_notes_regexes"] = r.WithholdNotesRegexes
	r.fieldMap["full_admin"] = r.FullAdmin
	r.fieldMap["can_affect_other_admins"] = r.CanAffectOtherAdmins
	r.fieldMap["can_delete_notes"] = r.CanDeleteNotes
	r.fieldMap["can_confirm_withheld_notes"] = r.CanConfirmWithheldNotes
	r.fieldMap["can_assign_roles"] = r.CanAssignRoles
	r.fieldMap["can_supress_interactions_between_users"] = r.CanSupressInteractionsBetweenUsers
	r.fieldMap["can_overwrite_display_names"] = r.CanOverwriteDisplayNames
	r.fieldMap["can_manage_custom_emotes"] = r.CanManageCustomEmotes
	r.fieldMap["can_view_deleted_notes"] = r.CanViewDeletedNotes
	r.fieldMap["can_recover_deleted_notes"] = r.CanRecoverDeletedNotes
	r.fieldMap["can_manage_avatar_decorations"] = r.CanManageAvatarDecorations
	r.fieldMap["can_manage_ads"] = r.CanManageAds
	r.fieldMap["can_send_announcements"] = r.CanSendAnnouncements
	r.fieldMap["can_delete_accounts"] = r.CanDeleteAccounts
}

func (r role) clone(db *gorm.DB) role {
	r.roleDo.ReplaceConnPool(db.Statement.ConnPool)
	return r
}

func (r role) replaceDB(db *gorm.DB) role {
	r.roleDo.ReplaceDB(db)
	return r
}

type roleDo struct{ gen.DO }

type IRoleDo interface {
	gen.SubQuery
	Debug() IRoleDo
	WithContext(ctx context.Context) IRoleDo
	WithResult(fc func(tx gen.Dao)) gen.ResultInfo
	ReplaceDB(db *gorm.DB)
	ReadDB() IRoleDo
	WriteDB() IRoleDo
	As(alias string) gen.Dao
	Session(config *gorm.Session) IRoleDo
	Columns(cols ...field.Expr) gen.Columns
	Clauses(conds ...clause.Expression) IRoleDo
	Not(conds ...gen.Condition) IRoleDo
	Or(conds ...gen.Condition) IRoleDo
	Select(conds ...field.Expr) IRoleDo
	Where(conds ...gen.Condition) IRoleDo
	Order(conds ...field.Expr) IRoleDo
	Distinct(cols ...field.Expr) IRoleDo
	Omit(cols ...field.Expr) IRoleDo
	Join(table schema.Tabler, on ...field.Expr) IRoleDo
	LeftJoin(table schema.Tabler, on ...field.Expr) IRoleDo
	RightJoin(table schema.Tabler, on ...field.Expr) IRoleDo
	Group(cols ...field.Expr) IRoleDo
	Having(conds ...gen.Condition) IRoleDo
	Limit(limit int) IRoleDo
	Offset(offset int) IRoleDo
	Count() (count int64, err error)
	Scopes(funcs ...func(gen.Dao) gen.Dao) IRoleDo
	Unscoped() IRoleDo
	Create(values ...*models.Role) error
	CreateInBatches(values []*models.Role, batchSize int) error
	Save(values ...*models.Role) error
	First() (*models.Role, error)
	Take() (*models.Role, error)
	Last() (*models.Role, error)
	Find() ([]*models.Role, error)
	FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Role, err error)
	FindInBatches(result *[]*models.Role, batchSize int, fc func(tx gen.Dao, batch int) error) error
	Pluck(column field.Expr, dest interface{}) error
	Delete(...*models.Role) (info gen.ResultInfo, err error)
	Update(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	Updates(value interface{}) (info gen.ResultInfo, err error)
	UpdateColumn(column field.Expr, value interface{}) (info gen.ResultInfo, err error)
	UpdateColumnSimple(columns ...field.AssignExpr) (info gen.ResultInfo, err error)
	UpdateColumns(value interface{}) (info gen.ResultInfo, err error)
	UpdateFrom(q gen.SubQuery) gen.Dao
	Attrs(attrs ...field.AssignExpr) IRoleDo
	Assign(attrs ...field.AssignExpr) IRoleDo
	Joins(fields ...field.RelationField) IRoleDo
	Preload(fields ...field.RelationField) IRoleDo
	FirstOrInit() (*models.Role, error)
	FirstOrCreate() (*models.Role, error)
	FindByPage(offset int, limit int) (result []*models.Role, count int64, err error)
	ScanByPage(result interface{}, offset int, limit int) (count int64, err error)
	Scan(result interface{}) (err error)
	Returning(value interface{}, columns ...string) IRoleDo
	UnderlyingDB() *gorm.DB
	schema.Tabler
}

func (r roleDo) Debug() IRoleDo {
	return r.withDO(r.DO.Debug())
}

func (r roleDo) WithContext(ctx context.Context) IRoleDo {
	return r.withDO(r.DO.WithContext(ctx))
}

func (r roleDo) ReadDB() IRoleDo {
	return r.Clauses(dbresolver.Read)
}

func (r roleDo) WriteDB() IRoleDo {
	return r.Clauses(dbresolver.Write)
}

func (r roleDo) Session(config *gorm.Session) IRoleDo {
	return r.withDO(r.DO.Session(config))
}

func (r roleDo) Clauses(conds ...clause.Expression) IRoleDo {
	return r.withDO(r.DO.Clauses(conds...))
}

func (r roleDo) Returning(value interface{}, columns ...string) IRoleDo {
	return r.withDO(r.DO.Returning(value, columns...))
}

func (r roleDo) Not(conds ...gen.Condition) IRoleDo {
	return r.withDO(r.DO.Not(conds...))
}

func (r roleDo) Or(conds ...gen.Condition) IRoleDo {
	return r.withDO(r.DO.Or(conds...))
}

func (r roleDo) Select(conds ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Select(conds...))
}

func (r roleDo) Where(conds ...gen.Condition) IRoleDo {
	return r.withDO(r.DO.Where(conds...))
}

func (r roleDo) Order(conds ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Order(conds...))
}

func (r roleDo) Distinct(cols ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Distinct(cols...))
}

func (r roleDo) Omit(cols ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Omit(cols...))
}

func (r roleDo) Join(table schema.Tabler, on ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Join(table, on...))
}

func (r roleDo) LeftJoin(table schema.Tabler, on ...field.Expr) IRoleDo {
	return r.withDO(r.DO.LeftJoin(table, on...))
}

func (r roleDo) RightJoin(table schema.Tabler, on ...field.Expr) IRoleDo {
	return r.withDO(r.DO.RightJoin(table, on...))
}

func (r roleDo) Group(cols ...field.Expr) IRoleDo {
	return r.withDO(r.DO.Group(cols...))
}

func (r roleDo) Having(conds ...gen.Condition) IRoleDo {
	return r.withDO(r.DO.Having(conds...))
}

func (r roleDo) Limit(limit int) IRoleDo {
	return r.withDO(r.DO.Limit(limit))
}

func (r roleDo) Offset(offset int) IRoleDo {
	return r.withDO(r.DO.Offset(offset))
}

func (r roleDo) Scopes(funcs ...func(gen.Dao) gen.Dao) IRoleDo {
	return r.withDO(r.DO.Scopes(funcs...))
}

func (r roleDo) Unscoped() IRoleDo {
	return r.withDO(r.DO.Unscoped())
}

func (r roleDo) Create(values ...*models.Role) error {
	if len(values) == 0 {
		return nil
	}
	return r.DO.Create(values)
}

func (r roleDo) CreateInBatches(values []*models.Role, batchSize int) error {
	return r.DO.CreateInBatches(values, batchSize)
}

// Save : !!! underlying implementation is different with GORM
// The method is equivalent to executing the statement: db.Clauses(clause.OnConflict{UpdateAll: true}).Create(values)
func (r roleDo) Save(values ...*models.Role) error {
	if len(values) == 0 {
		return nil
	}
	return r.DO.Save(values)
}

func (r roleDo) First() (*models.Role, error) {
	if result, err := r.DO.First(); err != nil {
		return nil, err
	} else {
		return result.(*models.Role), nil
	}
}

func (r roleDo) Take() (*models.Role, error) {
	if result, err := r.DO.Take(); err != nil {
		return nil, err
	} else {
		return result.(*models.Role), nil
	}
}

func (r roleDo) Last() (*models.Role, error) {
	if result, err := r.DO.Last(); err != nil {
		return nil, err
	} else {
		return result.(*models.Role), nil
	}
}

func (r roleDo) Find() ([]*models.Role, error) {
	result, err := r.DO.Find()
	return result.([]*models.Role), err
}

func (r roleDo) FindInBatch(batchSize int, fc func(tx gen.Dao, batch int) error) (results []*models.Role, err error) {
	buf := make([]*models.Role, 0, batchSize)
	err = r.DO.FindInBatches(&buf, batchSize, func(tx gen.Dao, batch int) error {
		defer func() { results = append(results, buf...) }()
		return fc(tx, batch)
	})
	return results, err
}

func (r roleDo) FindInBatches(result *[]*models.Role, batchSize int, fc func(tx gen.Dao, batch int) error) error {
	return r.DO.FindInBatches(result, batchSize, fc)
}

func (r roleDo) Attrs(attrs ...field.AssignExpr) IRoleDo {
	return r.withDO(r.DO.Attrs(attrs...))
}

func (r roleDo) Assign(attrs ...field.AssignExpr) IRoleDo {
	return r.withDO(r.DO.Assign(attrs...))
}

func (r roleDo) Joins(fields ...field.RelationField) IRoleDo {
	for _, _f := range fields {
		r = *r.withDO(r.DO.Joins(_f))
	}
	return &r
}

func (r roleDo) Preload(fields ...field.RelationField) IRoleDo {
	for _, _f := range fields {
		r = *r.withDO(r.DO.Preload(_f))
	}
	return &r
}

func (r roleDo) FirstOrInit() (*models.Role, error) {
	if result, err := r.DO.FirstOrInit(); err != nil {
		return nil, err
	} else {
		return result.(*models.Role), nil
	}
}

func (r roleDo) FirstOrCreate() (*models.Role, error) {
	if result, err := r.DO.FirstOrCreate(); err != nil {
		return nil, err
	} else {
		return result.(*models.Role), nil
	}
}

func (r roleDo) FindByPage(offset int, limit int) (result []*models.Role, count int64, err error) {
	result, err = r.Offset(offset).Limit(limit).Find()
	if err != nil {
		return
	}

	if size := len(result); 0 < limit && 0 < size && size < limit {
		count = int64(size + offset)
		return
	}

	count, err = r.Offset(-1).Limit(-1).Count()
	return
}

func (r roleDo) ScanByPage(result interface{}, offset int, limit int) (count int64, err error) {
	count, err = r.Count()
	if err != nil {
		return
	}

	err = r.Offset(offset).Limit(limit).Scan(result)
	return
}

func (r roleDo) Scan(result interface{}) (err error) {
	return r.DO.Scan(result)
}

func (r roleDo) Delete(models ...*models.Role) (result gen.ResultInfo, err error) {
	return r.DO.Delete(models)
}

func (r *roleDo) withDO(do gen.Dao) *roleDo {
	r.DO = *do.(*gen.DO)
	return r
}
