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
}