Skip to content
This repository was archived by the owner on Sep 7, 2021. It is now read-only.
This repository is currently being migrated. It's locked while the migration is in progress.

Commit e3550c7

Browse files
authored
fix some bug on extends find (#916)
1 parent d966376 commit e3550c7

File tree

2 files changed

+91
-1
lines changed

2 files changed

+91
-1
lines changed

engine.go

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1091,7 +1091,25 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) {
10911091
pk := make([]interface{}, len(table.PrimaryKeys))
10921092
for i, col := range table.PKColumns() {
10931093
var err error
1094-
pkField := v.FieldByName(col.FieldName)
1094+
1095+
fieldName := col.FieldName
1096+
for {
1097+
parts := strings.SplitN(fieldName, ".", 2)
1098+
if len(parts) == 1 {
1099+
break
1100+
}
1101+
1102+
v = v.FieldByName(parts[0])
1103+
if v.Kind() == reflect.Ptr {
1104+
v = v.Elem()
1105+
}
1106+
if v.Kind() != reflect.Struct {
1107+
return nil, ErrUnSupportedType
1108+
}
1109+
fieldName = parts[1]
1110+
}
1111+
fmt.Println(table.Name, fieldName, v)
1112+
pkField := v.FieldByName(fieldName)
10951113
switch pkField.Kind() {
10961114
case reflect.String:
10971115
pk[i], err = engine.idTypeAssertion(col, pkField.String())

session_find_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,5 +655,77 @@ func TestFindMapStringId(t *testing.T) {
655655
cnt, err = testEngine.ID("1").Delete(new(FindMapDevice))
656656
assert.NoError(t, err)
657657
assert.EqualValues(t, 1, cnt)
658+
}
659+
660+
func TestFindExtends(t *testing.T) {
661+
type FindExtendsB struct {
662+
ID int64
663+
}
664+
665+
type FindExtendsA struct {
666+
FindExtendsB `xorm:"extends"`
667+
}
668+
669+
assert.NoError(t, prepareEngine())
670+
assertSync(t, new(FindExtendsA))
671+
672+
cnt, err := testEngine.Insert(&FindExtendsA{
673+
FindExtendsB: FindExtendsB{},
674+
})
675+
assert.NoError(t, err)
676+
assert.EqualValues(t, 1, cnt)
677+
678+
cnt, err = testEngine.Insert(&FindExtendsA{
679+
FindExtendsB: FindExtendsB{},
680+
})
681+
assert.NoError(t, err)
682+
assert.EqualValues(t, 1, cnt)
683+
684+
var results []FindExtendsA
685+
err = testEngine.Find(&results)
686+
assert.NoError(t, err)
687+
assert.EqualValues(t, 2, len(results))
688+
}
689+
690+
func TestFindExtends3(t *testing.T) {
691+
type FindExtendsCC struct {
692+
ID int64
693+
Name string
694+
}
695+
696+
type FindExtendsBB struct {
697+
FindExtendsCC `xorm:"extends"`
698+
}
699+
700+
type FindExtendsAA struct {
701+
FindExtendsBB `xorm:"extends"`
702+
}
658703

704+
assert.NoError(t, prepareEngine())
705+
assertSync(t, new(FindExtendsAA))
706+
707+
cnt, err := testEngine.Insert(&FindExtendsAA{
708+
FindExtendsBB: FindExtendsBB{
709+
FindExtendsCC: FindExtendsCC{
710+
Name: "cc1",
711+
},
712+
},
713+
})
714+
assert.NoError(t, err)
715+
assert.EqualValues(t, 1, cnt)
716+
717+
cnt, err = testEngine.Insert(&FindExtendsAA{
718+
FindExtendsBB: FindExtendsBB{
719+
FindExtendsCC: FindExtendsCC{
720+
Name: "cc2",
721+
},
722+
},
723+
})
724+
assert.NoError(t, err)
725+
assert.EqualValues(t, 1, cnt)
726+
727+
var results []FindExtendsAA
728+
err = testEngine.Find(&results)
729+
assert.NoError(t, err)
730+
assert.EqualValues(t, 2, len(results))
659731
}

0 commit comments

Comments
 (0)