From b8373f09d7e775f238cc7ae097540ce8543791cd Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 31 Oct 2017 16:51:22 +0800 Subject: [PATCH] improve Load find --- session_associate.go | 23 ++++++----- session_associate_test.go | 82 +++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 50 deletions(-) diff --git a/session_associate.go b/session_associate.go index aa922db2..62e924a3 100644 --- a/session_associate.go +++ b/session_associate.go @@ -27,7 +27,7 @@ func (session *Session) Load(beanOrSlices interface{}, cols ...string) error { // loadFind load 's belongs to tag field immedicatlly func (session *Session) loadFind(slices interface{}, cols ...string) error { - /*v := reflect.ValueOf(slices) + v := reflect.ValueOf(slices) if v.Kind() == reflect.Ptr { v = v.Elem() } @@ -43,12 +43,12 @@ func (session *Session) loadFind(slices interface{}, cols ...string) error { if vv.Kind() == reflect.Ptr { vv = vv.Elem() } - tb, err := session.Engine.autoMapType(vv) + tb, err := session.engine.autoMapType(vv) if err != nil { return err } - var pks = make(map[string][]core.PK) + var pks = make(map[*core.Column][]interface{}) for i := 0; i < v.Len(); i++ { ev := v.Index(i) @@ -64,33 +64,32 @@ func (session *Session) loadFind(slices interface{}, cols ...string) error { return err } - pk, err := session.Engine.idOfV(*colV) + pk, err := session.engine.idOfV(*colV) if err != nil { return err } - var colPtr reflect.Value + /*var colPtr reflect.Value if colV.Kind() == reflect.Ptr { colPtr = *colV } else { colPtr = colV.Addr() - } + }*/ if !isZero(pk[0]) { - pks[col.Name] = append(pks[col.Name], pk) + pks[col] = append(pks[col], pk[0]) } } } } } - for colName, pk := range pks { - slice := reflect.MakeSlice(tp, 0, len(pk)) - err = session.In("", pk).Find(slice.Addr().Interafce()) + for col, pk := range pks { + slice := reflect.MakeSlice(col.FieldType, 0, len(pk)) + err = session.In(col.Name, pk...).find(slice.Addr().Interface()) if err != nil { return err } - - }*/ + } return nil } diff --git a/session_associate_test.go b/session_associate_test.go index ae2b0ee0..94624216 100644 --- a/session_associate_test.go +++ b/session_associate_test.go @@ -5,7 +5,6 @@ package xorm import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -14,36 +13,36 @@ import ( func TestBelongsTo_Get(t *testing.T) { assert.NoError(t, prepareEngine()) - type Face struct { + type Face1 struct { Id int64 Name string } - type Nose struct { + type Nose1 struct { 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) - var face = Face{ + var face = Face1{ Name: "face1", } _, err = testEngine.Insert(&face) assert.NoError(t, err) - var cfgFace Face + var cfgFace Face1 has, err := testEngine.Get(&cfgFace) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, face, cfgFace) - var nose = Nose{Face: face} + var nose = Nose1{Face: face} _, err = testEngine.Insert(&nose) assert.NoError(t, err) - var cfgNose Nose + var cfgNose Nose1 has, err = testEngine.Get(&cfgNose) assert.NoError(t, err) 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, "face1", cfgNose.Face.Name) - var cfgNose2 Nose + var cfgNose2 Nose1 has, err = testEngine.Cascade().Get(&cfgNose2) assert.NoError(t, err) assert.Equal(t, true, has) @@ -69,36 +68,36 @@ func TestBelongsTo_Get(t *testing.T) { func TestBelongsTo_GetPtr(t *testing.T) { assert.NoError(t, prepareEngine()) - type Face struct { + type Face2 struct { Id int64 Name string } - type Nose struct { + type Nose2 struct { 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) - var face = Face{ + var face = Face2{ Name: "face1", } _, err = testEngine.Insert(&face) assert.NoError(t, err) - var cfgFace Face + var cfgFace Face2 has, err := testEngine.Get(&cfgFace) assert.NoError(t, err) assert.Equal(t, true, has) assert.Equal(t, face, cfgFace) - var nose = Nose{Face: &face} + var nose = Nose2{Face: &face} _, err = testEngine.Insert(&nose) assert.NoError(t, err) - var cfgNose Nose + var cfgNose Nose2 has, err = testEngine.Get(&cfgNose) assert.NoError(t, err) 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, "face1", cfgNose.Face.Name) - var cfgNose2 Nose + var cfgNose2 Nose2 has, err = testEngine.Cascade().Get(&cfgNose2) assert.NoError(t, err) assert.Equal(t, true, has) @@ -123,36 +122,36 @@ func TestBelongsTo_GetPtr(t *testing.T) { func TestBelongsTo_Find(t *testing.T) { assert.NoError(t, prepareEngine()) - type Face struct { + type Face3 struct { Id int64 Name string } - type Nose struct { + type Nose3 struct { 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) - var face1 = Face{ + var face1 = Face3{ Name: "face1", } - var face2 = Face{ + var face2 = Face3{ Name: "face2", } _, err = testEngine.Insert(&face1, &face2) assert.NoError(t, err) - var noses = []Nose{ + var noses = []Nose3{ {Face: face1}, {Face: face2}, } _, err = testEngine.Insert(&noses) assert.NoError(t, err) - var noses1 []Nose + var noses1 []Nose3 err = testEngine.Find(&noses1) assert.NoError(t, err) 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[1].Face.Name) - var noses2 []Nose + var noses2 []Nose3 err = testEngine.Cascade().Find(&noses2) assert.NoError(t, err) assert.Equal(t, 2, len(noses2)) - fmt.Println("noses:", noses2) assert.Equal(t, face1.Id, noses2[0].Face.Id) assert.Equal(t, face2.Id, noses2[1].Face.Id) assert.Equal(t, "face1", noses2[0].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) { assert.NoError(t, prepareEngine()) - type Face struct { + type Face4 struct { Id int64 Name string } - type Nose struct { + type Nose4 struct { 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) - var face1 = Face{ + var face1 = Face4{ Name: "face1", } - var face2 = Face{ + var face2 = Face4{ Name: "face2", } _, err = testEngine.Insert(&face1, &face2) assert.NoError(t, err) - var noses = []Nose{ + var noses = []Nose4{ {Face: &face1}, {Face: &face2}, } _, err = testEngine.Insert(&noses) assert.NoError(t, err) - var noses1 []Nose + var noses1 []Nose4 err = testEngine.Find(&noses1) assert.NoError(t, err) 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[1].Face.Name) - var noses2 []Nose + var noses2 []Nose4 err = testEngine.Cascade().Find(&noses2) assert.NoError(t, err) 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, "face1", noses2[0].Face.Name) assert.Equal(t, "face2", noses2[1].Face.Name) + + err = testEngine.Load(noses2, "face") + assert.NoError(t, err) }