package orm

import (
	

	
)

func ( reflect.Value) reflect.Value {
	switch .Kind() {
	case reflect.Interface:
		return (.Elem())
	case reflect.Ptr:
		return .Elem()
	default:
		return 
	}
}

func ( reflect.Type) reflect.Type {
	if .Kind() == reflect.Ptr {
		 = .Elem()
	}
	return 
}

func ( reflect.Value) reflect.Type {
	 := .Type().Elem()
	if .Kind() == reflect.Interface && .Len() > 0 {
		return indirect(.Index(0).Elem()).Type()
	}
	return indirectType()
}

func ( reflect.Type,  []int) reflect.Type {
	for ,  := range  {
		switch .Kind() {
		case reflect.Ptr:
			 = .Elem()
		case reflect.Slice:
			 = indirectType(.Elem())
		}
		 = .Field().Type
	}
	return indirectType()
}

func ( reflect.Value,  []int) ( reflect.Value,  bool) {
	if len() == 1 {
		return .Field([0]), true
	}

	for ,  := range  {
		if  > 0 {
			if .Kind() == reflect.Ptr {
				if .IsNil() {
					return , false
				}
				 = .Elem()
			}
		}
		 = .Field()
	}
	return , true
}

func ( reflect.Value,  []int) reflect.Value {
	if len() == 1 {
		return .Field([0])
	}

	for ,  := range  {
		if  > 0 {
			 = indirectNil()
		}
		 = .Field()
	}
	return 
}

func ( reflect.Value) reflect.Value {
	if .Kind() == reflect.Ptr {
		if .IsNil() {
			.Set(reflect.New(.Type().Elem()))
		}
		 = .Elem()
	}
	return 
}

func ( reflect.Value,  []int,  func(reflect.Value)) {
	 = reflect.Indirect()
	switch .Kind() {
	case reflect.Slice:
		 := .Len()
		for  := 0;  < ; ++ {
			visitField(.Index(), , )
		}
	default:
		visitField(, , )
	}
}

func ( reflect.Value,  []int,  func(reflect.Value)) {
	 = reflect.Indirect()
	if len() > 0 {
		 = .Field([0])
		if .Kind() == reflect.Ptr && .IsNil() {
			return
		}
		walk(, [1:], )
	} else {
		()
	}
}

func ( TableModel,  []*Field) map[string][]reflect.Value {
	 := .Relation().Field.Index
	 := make(map[string][]reflect.Value)
	var  []byte
	walk(.Root(), .ParentIndex(), func( reflect.Value) {
		 = modelID([:0], , )
		[string()] = append([string()], .FieldByIndex())
	})
	return 
}

func ( []byte,  reflect.Value,  []*Field) []byte {
	for ,  := range  {
		if  > 0 {
			 = append(, ',')
		}
		 = .AppendValue(, , 0)
	}
	return 
}

func ( []byte,  types.Safe,  []*Field) []byte {
	for ,  := range  {
		if  > 0 {
			 = append(, ", "...)
		}

		if len() > 0 {
			 = append(, ...)
			 = append(, '.')
		}
		 = append(, .Column...)
	}
	return 
}