package orm

import (
	

	
)

type DeleteQuery struct {
	q           *Query
	placeholder bool
}

var (
	_ QueryAppender = (*DeleteQuery)(nil)
	_ QueryCommand  = (*DeleteQuery)(nil)
)

func ( *Query) *DeleteQuery {
	return &DeleteQuery{
		q: ,
	}
}

func ( *DeleteQuery) () string {
	,  := .AppendQuery(defaultFmter, nil)
	if  != nil {
		panic()
	}
	return string()
}

func ( *DeleteQuery) () QueryOp {
	return DeleteOp
}

func ( *DeleteQuery) () QueryCommand {
	return &DeleteQuery{
		q:           .q.Clone(),
		placeholder: .placeholder,
	}
}

func ( *DeleteQuery) () *Query {
	return .q
}

func ( *DeleteQuery) ( []byte) ([]byte, error) {
	 := .Clone().(*DeleteQuery)
	.placeholder = true
	return .AppendQuery(dummyFormatter{}, )
}

func ( *DeleteQuery) ( QueryFormatter,  []byte) ( []byte,  error) {
	if .q.stickyErr != nil {
		return nil, .q.stickyErr
	}

	if len(.q.with) > 0 {
		,  = .q.appendWith(, )
		if  != nil {
			return nil, 
		}
	}

	 = append(, "DELETE FROM "...)
	,  = .q.appendFirstTableWithAlias(, )
	if  != nil {
		return nil, 
	}

	if .q.hasMultiTables() {
		 = append(, " USING "...)
		,  = .q.appendOtherTables(, )
		if  != nil {
			return nil, 
		}
	}

	 = append(, " WHERE "...)
	 := .q.tableModel.Value()

	if .q.isSliceModelWithData() {
		if len(.q.where) > 0 {
			,  = .q.appendWhere(, )
			if  != nil {
				return nil, 
			}
		} else {
			 := .q.tableModel.Table()
			 = .checkPKs()
			if  != nil {
				return nil, 
			}

			 = appendColumnAndSliceValue(, , , .Alias, .PKs)
		}
	} else {
		,  = .q.mustAppendWhere(, )
		if  != nil {
			return nil, 
		}
	}

	if len(.q.returning) > 0 {
		,  = .q.appendReturning(, )
		if  != nil {
			return nil, 
		}
	}

	return , .q.stickyErr
}

func (
	 QueryFormatter,  []byte,  reflect.Value,  types.Safe,  []*Field,
) []byte {
	if len() > 1 {
		 = append(, '(')
	}
	 = appendColumns(, , )
	if len() > 1 {
		 = append(, ')')
	}

	 = append(, " IN ("...)

	 := isTemplateFormatter()
	 := .Len()
	for  := 0;  < ; ++ {
		if  > 0 {
			 = append(, ", "...)
		}

		 := indirect(.Index())

		if len() > 1 {
			 = append(, '(')
		}
		for ,  := range  {
			if  > 0 {
				 = append(, ", "...)
			}
			if  {
				 = append(, '?')
			} else {
				 = .AppendValue(, , 1)
			}
		}
		if len() > 1 {
			 = append(, ')')
		}
	}

	 = append(, ')')

	return 
}