package orm

import (
	
	

	
	
)

type m2mModel struct {
	*sliceTableModel
	baseTable *Table
	rel       *Relation

	buf       []byte
	dstValues map[string][]reflect.Value
	columns   map[string]string
}

var _ TableModel = (*m2mModel)(nil)

func ( *join) *m2mModel {
	 := .BaseModel.Table()
	 := .JoinModel.(*sliceTableModel)
	 := dstValues(, .PKs)
	if len() == 0 {
		return nil
	}
	 := &m2mModel{
		sliceTableModel: ,
		baseTable:       ,
		rel:             .Rel,

		dstValues: ,
		columns:   make(map[string]string),
	}
	if !.sliceOfPtr {
		.strct = reflect.New(.table.Type).Elem()
	}
	return 
}

func ( *m2mModel) () ColumnScanner {
	if .sliceOfPtr {
		.strct = reflect.New(.table.Type).Elem()
	} else {
		.strct.Set(.table.zeroStruct)
	}
	.structInited = false
	return 
}

func ( *m2mModel) ( ColumnScanner) error {
	,  := .modelIDMap(.buf[:0])
	if  != nil {
		return 
	}
	.buf = 

	,  := .dstValues[string()]
	if ! {
		return fmt.Errorf(
			"pg: relation=%q does not have base %s with id=%q (check join conditions)",
			.rel.Field.GoName, .baseTable, )
	}

	for ,  := range  {
		if .sliceOfPtr {
			.Set(reflect.Append(, .strct.Addr()))
		} else {
			.Set(reflect.Append(, .strct))
		}
	}

	return nil
}

func ( *m2mModel) ( []byte) ([]byte, error) {
	for ,  := range .rel.M2MBaseFKs {
		if  > 0 {
			 = append(, ',')
		}
		if ,  := .columns[];  {
			 = append(, ...)
		} else {
			return nil, fmt.Errorf("pg: %s does not have column=%q",
				.sliceTableModel, )
		}
	}
	return , nil
}

func ( *m2mModel) ( types.ColumnInfo,  types.Reader,  int) error {
	if  > 0 {
		,  := .ReadFullTemp()
		if  != nil {
			return 
		}

		.columns[.Name] = string()
		 = pool.NewBytesReader()
	} else {
		.columns[.Name] = ""
	}

	if ,  := .sliceTableModel.scanColumn(, , );  {
		return 
	}
	return nil
}