improve Load find

This commit is contained in:
Lunny Xiao 2017-10-31 16:51:22 +08:00
parent 2b06f05d40
commit b8373f09d7
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
2 changed files with 55 additions and 50 deletions

View File

@ -27,7 +27,7 @@ func (session *Session) Load(beanOrSlices interface{}, cols ...string) error {
// loadFind load 's belongs to tag field immedicatlly // loadFind load 's belongs to tag field immedicatlly
func (session *Session) loadFind(slices interface{}, cols ...string) error { func (session *Session) loadFind(slices interface{}, cols ...string) error {
/*v := reflect.ValueOf(slices) v := reflect.ValueOf(slices)
if v.Kind() == reflect.Ptr { if v.Kind() == reflect.Ptr {
v = v.Elem() v = v.Elem()
} }
@ -43,12 +43,12 @@ func (session *Session) loadFind(slices interface{}, cols ...string) error {
if vv.Kind() == reflect.Ptr { if vv.Kind() == reflect.Ptr {
vv = vv.Elem() vv = vv.Elem()
} }
tb, err := session.Engine.autoMapType(vv) tb, err := session.engine.autoMapType(vv)
if err != nil { if err != nil {
return err return err
} }
var pks = make(map[string][]core.PK) var pks = make(map[*core.Column][]interface{})
for i := 0; i < v.Len(); i++ { for i := 0; i < v.Len(); i++ {
ev := v.Index(i) ev := v.Index(i)
@ -64,33 +64,32 @@ func (session *Session) loadFind(slices interface{}, cols ...string) error {
return err return err
} }
pk, err := session.Engine.idOfV(*colV) pk, err := session.engine.idOfV(*colV)
if err != nil { if err != nil {
return err return err
} }
var colPtr reflect.Value /*var colPtr reflect.Value
if colV.Kind() == reflect.Ptr { if colV.Kind() == reflect.Ptr {
colPtr = *colV colPtr = *colV
} else { } else {
colPtr = colV.Addr() colPtr = colV.Addr()
} }*/
if !isZero(pk[0]) { if !isZero(pk[0]) {
pks[col.Name] = append(pks[col.Name], pk) pks[col] = append(pks[col], pk[0])
} }
} }
} }
} }
} }
for colName, pk := range pks { for col, pk := range pks {
slice := reflect.MakeSlice(tp, 0, len(pk)) slice := reflect.MakeSlice(col.FieldType, 0, len(pk))
err = session.In("", pk).Find(slice.Addr().Interafce()) err = session.In(col.Name, pk...).find(slice.Addr().Interface())
if err != nil { if err != nil {
return err return err
} }
}
}*/
return nil return nil
} }

View File

@ -5,7 +5,6 @@
package xorm package xorm
import ( import (
"fmt"
"testing" "testing"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -14,36 +13,36 @@ import (
func TestBelongsTo_Get(t *testing.T) { func TestBelongsTo_Get(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type Face struct { type Face1 struct {
Id int64 Id int64
Name string Name string
} }
type Nose struct { type Nose1 struct {
Id int64 Id int64
Face Face `xorm:"belongs_to"` Face Face1 `xorm:"belongs_to"`
} }
err := testEngine.Sync2(new(Nose), new(Face)) err := testEngine.Sync2(new(Nose1), new(Face1))
assert.NoError(t, err) assert.NoError(t, err)
var face = Face{ var face = Face1{
Name: "face1", Name: "face1",
} }
_, err = testEngine.Insert(&face) _, err = testEngine.Insert(&face)
assert.NoError(t, err) assert.NoError(t, err)
var cfgFace Face var cfgFace Face1
has, err := testEngine.Get(&cfgFace) has, err := testEngine.Get(&cfgFace)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
assert.Equal(t, face, cfgFace) assert.Equal(t, face, cfgFace)
var nose = Nose{Face: face} var nose = Nose1{Face: face}
_, err = testEngine.Insert(&nose) _, err = testEngine.Insert(&nose)
assert.NoError(t, err) assert.NoError(t, err)
var cfgNose Nose var cfgNose Nose1
has, err = testEngine.Get(&cfgNose) has, err = testEngine.Get(&cfgNose)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
@ -57,7 +56,7 @@ func TestBelongsTo_Get(t *testing.T) {
assert.Equal(t, nose.Face.Id, cfgNose.Face.Id) assert.Equal(t, nose.Face.Id, cfgNose.Face.Id)
assert.Equal(t, "face1", cfgNose.Face.Name) assert.Equal(t, "face1", cfgNose.Face.Name)
var cfgNose2 Nose var cfgNose2 Nose1
has, err = testEngine.Cascade().Get(&cfgNose2) has, err = testEngine.Cascade().Get(&cfgNose2)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
@ -69,36 +68,36 @@ func TestBelongsTo_Get(t *testing.T) {
func TestBelongsTo_GetPtr(t *testing.T) { func TestBelongsTo_GetPtr(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type Face struct { type Face2 struct {
Id int64 Id int64
Name string Name string
} }
type Nose struct { type Nose2 struct {
Id int64 Id int64
Face *Face `xorm:"belongs_to"` Face *Face2 `xorm:"belongs_to"`
} }
err := testEngine.Sync2(new(Nose), new(Face)) err := testEngine.Sync2(new(Nose2), new(Face2))
assert.NoError(t, err) assert.NoError(t, err)
var face = Face{ var face = Face2{
Name: "face1", Name: "face1",
} }
_, err = testEngine.Insert(&face) _, err = testEngine.Insert(&face)
assert.NoError(t, err) assert.NoError(t, err)
var cfgFace Face var cfgFace Face2
has, err := testEngine.Get(&cfgFace) has, err := testEngine.Get(&cfgFace)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
assert.Equal(t, face, cfgFace) assert.Equal(t, face, cfgFace)
var nose = Nose{Face: &face} var nose = Nose2{Face: &face}
_, err = testEngine.Insert(&nose) _, err = testEngine.Insert(&nose)
assert.NoError(t, err) assert.NoError(t, err)
var cfgNose Nose var cfgNose Nose2
has, err = testEngine.Get(&cfgNose) has, err = testEngine.Get(&cfgNose)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
@ -111,7 +110,7 @@ func TestBelongsTo_GetPtr(t *testing.T) {
assert.Equal(t, nose.Face.Id, cfgNose.Face.Id) assert.Equal(t, nose.Face.Id, cfgNose.Face.Id)
assert.Equal(t, "face1", cfgNose.Face.Name) assert.Equal(t, "face1", cfgNose.Face.Name)
var cfgNose2 Nose var cfgNose2 Nose2
has, err = testEngine.Cascade().Get(&cfgNose2) has, err = testEngine.Cascade().Get(&cfgNose2)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, true, has) assert.Equal(t, true, has)
@ -123,36 +122,36 @@ func TestBelongsTo_GetPtr(t *testing.T) {
func TestBelongsTo_Find(t *testing.T) { func TestBelongsTo_Find(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type Face struct { type Face3 struct {
Id int64 Id int64
Name string Name string
} }
type Nose struct { type Nose3 struct {
Id int64 Id int64
Face Face `xorm:"belongs_to"` Face Face3 `xorm:"belongs_to"`
} }
err := testEngine.Sync2(new(Nose), new(Face)) err := testEngine.Sync2(new(Nose3), new(Face3))
assert.NoError(t, err) assert.NoError(t, err)
var face1 = Face{ var face1 = Face3{
Name: "face1", Name: "face1",
} }
var face2 = Face{ var face2 = Face3{
Name: "face2", Name: "face2",
} }
_, err = testEngine.Insert(&face1, &face2) _, err = testEngine.Insert(&face1, &face2)
assert.NoError(t, err) assert.NoError(t, err)
var noses = []Nose{ var noses = []Nose3{
{Face: face1}, {Face: face1},
{Face: face2}, {Face: face2},
} }
_, err = testEngine.Insert(&noses) _, err = testEngine.Insert(&noses)
assert.NoError(t, err) assert.NoError(t, err)
var noses1 []Nose var noses1 []Nose3
err = testEngine.Find(&noses1) err = testEngine.Find(&noses1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(noses1)) assert.Equal(t, 2, len(noses1))
@ -161,50 +160,54 @@ func TestBelongsTo_Find(t *testing.T) {
assert.Equal(t, "", noses1[0].Face.Name) assert.Equal(t, "", noses1[0].Face.Name)
assert.Equal(t, "", noses1[1].Face.Name) assert.Equal(t, "", noses1[1].Face.Name)
var noses2 []Nose var noses2 []Nose3
err = testEngine.Cascade().Find(&noses2) err = testEngine.Cascade().Find(&noses2)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(noses2)) assert.Equal(t, 2, len(noses2))
fmt.Println("noses:", noses2)
assert.Equal(t, face1.Id, noses2[0].Face.Id) assert.Equal(t, face1.Id, noses2[0].Face.Id)
assert.Equal(t, face2.Id, noses2[1].Face.Id) assert.Equal(t, face2.Id, noses2[1].Face.Id)
assert.Equal(t, "face1", noses2[0].Face.Name) assert.Equal(t, "face1", noses2[0].Face.Name)
assert.Equal(t, "face2", noses2[1].Face.Name) assert.Equal(t, "face2", noses2[1].Face.Name)
err = testEngine.Load(noses1, "face")
assert.NoError(t, err)
assert.Equal(t, "face1", noses1[0].Face.Name)
assert.Equal(t, "face2", noses1[1].Face.Name)
} }
func TestBelongsTo_FindPtr(t *testing.T) { func TestBelongsTo_FindPtr(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type Face struct { type Face4 struct {
Id int64 Id int64
Name string Name string
} }
type Nose struct { type Nose4 struct {
Id int64 Id int64
Face *Face `xorm:"belongs_to"` Face *Face4 `xorm:"belongs_to"`
} }
err := testEngine.Sync2(new(Nose), new(Face)) err := testEngine.Sync2(new(Nose4), new(Face4))
assert.NoError(t, err) assert.NoError(t, err)
var face1 = Face{ var face1 = Face4{
Name: "face1", Name: "face1",
} }
var face2 = Face{ var face2 = Face4{
Name: "face2", Name: "face2",
} }
_, err = testEngine.Insert(&face1, &face2) _, err = testEngine.Insert(&face1, &face2)
assert.NoError(t, err) assert.NoError(t, err)
var noses = []Nose{ var noses = []Nose4{
{Face: &face1}, {Face: &face1},
{Face: &face2}, {Face: &face2},
} }
_, err = testEngine.Insert(&noses) _, err = testEngine.Insert(&noses)
assert.NoError(t, err) assert.NoError(t, err)
var noses1 []Nose var noses1 []Nose4
err = testEngine.Find(&noses1) err = testEngine.Find(&noses1)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(noses1)) assert.Equal(t, 2, len(noses1))
@ -213,7 +216,7 @@ func TestBelongsTo_FindPtr(t *testing.T) {
assert.Equal(t, "", noses1[0].Face.Name) assert.Equal(t, "", noses1[0].Face.Name)
assert.Equal(t, "", noses1[1].Face.Name) assert.Equal(t, "", noses1[1].Face.Name)
var noses2 []Nose var noses2 []Nose4
err = testEngine.Cascade().Find(&noses2) err = testEngine.Cascade().Find(&noses2)
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, 2, len(noses2)) assert.Equal(t, 2, len(noses2))
@ -223,4 +226,7 @@ func TestBelongsTo_FindPtr(t *testing.T) {
assert.Equal(t, face2.Id, noses2[1].Face.Id) assert.Equal(t, face2.Id, noses2[1].Face.Id)
assert.Equal(t, "face1", noses2[0].Face.Name) assert.Equal(t, "face1", noses2[0].Face.Name)
assert.Equal(t, "face2", noses2[1].Face.Name) assert.Equal(t, "face2", noses2[1].Face.Name)
err = testEngine.Load(noses2, "face")
assert.NoError(t, err)
} }