small optimization
This commit is contained in:
parent
99118594d5
commit
6e4cb7136a
113
session.go
113
session.go
|
@ -929,13 +929,13 @@ func (session *Session) cacheFind(t reflect.Type, sqlStr string, rowsSlicePtr in
|
||||||
if rv.Kind() != reflect.Ptr {
|
if rv.Kind() != reflect.Ptr {
|
||||||
rv = rv.Addr()
|
rv = rv.Addr()
|
||||||
}
|
}
|
||||||
bean := rv.Interface()
|
id := session.Engine.IdOfV(rv)
|
||||||
id := session.Engine.IdOf(bean)
|
|
||||||
sid, err := id.ToString()
|
sid, err := id.ToString()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bean := rv.Interface()
|
||||||
temps[ididxes[sid]] = bean
|
temps[ididxes[sid]] = bean
|
||||||
session.Engine.logger.Debug("[cacheFind] cache bean:", tableName, id, bean, temps)
|
session.Engine.logger.Debug("[cacheFind] cache bean:", tableName, id, bean, temps)
|
||||||
cacher.PutBean(tableName, sid, bean)
|
cacher.PutBean(tableName, sid, bean)
|
||||||
|
@ -1222,6 +1222,61 @@ func (session *Session) SumsInt(bean interface{}, columnNames ...string) ([]int6
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (session *Session) noCacheFind(sliceValue reflect.Value, sqlStr string, args ...interface{}) error {
|
||||||
|
var rawRows *core.Rows
|
||||||
|
var err error
|
||||||
|
|
||||||
|
session.queryPreprocess(&sqlStr, args...)
|
||||||
|
if session.IsAutoCommit {
|
||||||
|
_, rawRows, err = session.innerQuery(sqlStr, args...)
|
||||||
|
} else {
|
||||||
|
rawRows, err = session.Tx.Query(sqlStr, args...)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer rawRows.Close()
|
||||||
|
|
||||||
|
fields, err := rawRows.Columns()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
var newElemFunc func() reflect.Value
|
||||||
|
sliceElementType := sliceValue.Type().Elem()
|
||||||
|
if sliceElementType.Kind() == reflect.Ptr {
|
||||||
|
newElemFunc = func() reflect.Value {
|
||||||
|
return reflect.New(sliceElementType.Elem())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
newElemFunc = func() reflect.Value {
|
||||||
|
return reflect.New(sliceElementType)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var sliceValueSetFunc func(*reflect.Value)
|
||||||
|
|
||||||
|
if sliceValue.Kind() == reflect.Slice {
|
||||||
|
if sliceElementType.Kind() == reflect.Ptr {
|
||||||
|
sliceValueSetFunc = func(newValue *reflect.Value) {
|
||||||
|
sliceValue.Set(reflect.Append(sliceValue, reflect.ValueOf(newValue.Interface())))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
sliceValueSetFunc = func(newValue *reflect.Value) {
|
||||||
|
sliceValue.Set(reflect.Append(sliceValue, reflect.Indirect(reflect.ValueOf(newValue.Interface()))))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var newValue = newElemFunc()
|
||||||
|
dataStruct := rValue(newValue.Interface())
|
||||||
|
if dataStruct.Kind() != reflect.Struct {
|
||||||
|
return errors.New("Expected a pointer to a struct")
|
||||||
|
}
|
||||||
|
|
||||||
|
return session.rows2Beans(rawRows, fields, len(fields), session.Engine.autoMapType(dataStruct), newElemFunc, sliceValueSetFunc)
|
||||||
|
}
|
||||||
|
|
||||||
// Find retrieve records from table, condiBeans's non-empty fields
|
// Find retrieve records from table, condiBeans's non-empty fields
|
||||||
// are conditions. beans could be []Struct, []*Struct, map[int64]Struct
|
// are conditions. beans could be []Struct, []*Struct, map[int64]Struct
|
||||||
// map[int64]*Struct
|
// map[int64]*Struct
|
||||||
|
@ -1325,9 +1380,8 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
if session.Statement.JoinStr == "" {
|
if session.canCache() {
|
||||||
if cacher := session.Engine.getCacher2(table); cacher != nil &&
|
if cacher := session.Engine.getCacher2(table); cacher != nil &&
|
||||||
session.Statement.UseCache &&
|
|
||||||
!session.Statement.IsDistinct &&
|
!session.Statement.IsDistinct &&
|
||||||
!session.Statement.unscoped {
|
!session.Statement.unscoped {
|
||||||
err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...)
|
err = session.cacheFind(sliceElementType, sqlStr, rowsSlicePtr, args...)
|
||||||
|
@ -1340,56 +1394,7 @@ func (session *Session) Find(rowsSlicePtr interface{}, condiBean ...interface{})
|
||||||
}
|
}
|
||||||
|
|
||||||
if sliceValue.Kind() != reflect.Map {
|
if sliceValue.Kind() != reflect.Map {
|
||||||
var rawRows *core.Rows
|
return session.noCacheFind(sliceValue, sqlStr, args...)
|
||||||
|
|
||||||
session.queryPreprocess(&sqlStr, args...)
|
|
||||||
if session.IsAutoCommit {
|
|
||||||
_, rawRows, err = session.innerQuery(sqlStr, args...)
|
|
||||||
} else {
|
|
||||||
rawRows, err = session.Tx.Query(sqlStr, args...)
|
|
||||||
}
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer rawRows.Close()
|
|
||||||
|
|
||||||
fields, err := rawRows.Columns()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
var newElemFunc func() reflect.Value
|
|
||||||
if sliceElementType.Kind() == reflect.Ptr {
|
|
||||||
newElemFunc = func() reflect.Value {
|
|
||||||
return reflect.New(sliceElementType.Elem())
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
newElemFunc = func() reflect.Value {
|
|
||||||
return reflect.New(sliceElementType)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var sliceValueSetFunc func(*reflect.Value)
|
|
||||||
|
|
||||||
if sliceValue.Kind() == reflect.Slice {
|
|
||||||
if sliceElementType.Kind() == reflect.Ptr {
|
|
||||||
sliceValueSetFunc = func(newValue *reflect.Value) {
|
|
||||||
sliceValue.Set(reflect.Append(sliceValue, reflect.ValueOf(newValue.Interface())))
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
sliceValueSetFunc = func(newValue *reflect.Value) {
|
|
||||||
sliceValue.Set(reflect.Append(sliceValue, reflect.Indirect(reflect.ValueOf(newValue.Interface()))))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var newValue = newElemFunc()
|
|
||||||
dataStruct := rValue(newValue.Interface())
|
|
||||||
if dataStruct.Kind() != reflect.Struct {
|
|
||||||
return errors.New("Expected a pointer to a struct")
|
|
||||||
}
|
|
||||||
|
|
||||||
return session.rows2Beans(rawRows, fields, len(fields), session.Engine.autoMapType(dataStruct), newElemFunc, sliceValueSetFunc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resultsSlice, err := session.query(sqlStr, args...)
|
resultsSlice, err := session.query(sqlStr, args...)
|
||||||
|
|
Loading…
Reference in New Issue