From 07cc465e307239dc9f6b045eba53ecf571833743 Mon Sep 17 00:00:00 2001 From: Pacific73 Date: Mon, 30 Oct 2023 17:40:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Dpluck?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I5cd51ac3055b85ebcf8b13d2b9c6e931955df1f5 --- cache/helpers.go | 10 +++++++++- go.mod | 1 - go.sum | 2 -- testkit/functionality_test.go | 2 ++ testkit/test_query.go | 17 +++++++++++++++++ 5 files changed, 28 insertions(+), 4 deletions(-) diff --git a/cache/helpers.go b/cache/helpers.go index 6e5e2af..d050efc 100644 --- a/cache/helpers.go +++ b/cache/helpers.go @@ -217,6 +217,7 @@ func getPrimaryKeysFromExpr(expr clause.Expr, ttype string) []string { func getObjectsAfterLoad(db *gorm.DB) (primaryKeys []string, objects []interface{}) { primaryKeys = make([]string, 0) values := make([]reflect.Value, 0) + isPluck := false destValue := reflect.Indirect(reflect.ValueOf(db.Statement.Dest)) switch destValue.Kind() { @@ -225,6 +226,9 @@ func getObjectsAfterLoad(db *gorm.DB) (primaryKeys []string, objects []interface elem := destValue.Index(i) values = append(values, elem) } + if isBasicType(destValue.Type().Elem().Kind()) { + isPluck = true + } case reflect.Struct: values = append(values, destValue) } @@ -241,7 +245,7 @@ func getObjectsAfterLoad(db *gorm.DB) (primaryKeys []string, objects []interface objects = make([]interface{}, 0, len(values)) for _, elemValue := range values { - if valueOf != nil { + if valueOf != nil && !isPluck { primaryKey, isZero := valueOf(context.Background(), elemValue) if isZero { continue @@ -253,6 +257,10 @@ func getObjectsAfterLoad(db *gorm.DB) (primaryKeys []string, objects []interface return primaryKeys, objects } +func isBasicType(k reflect.Kind) bool { + return (k > 0 && k < reflect.Array) || (k == reflect.String) +} + func uniqueStringSlice(slice []string) []string { retSlice := make([]string, 0) mmap := make(map[string]struct{}) diff --git a/go.mod b/go.mod index 2d8351b..8972fa8 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.15 require ( github.com/go-redis/redis/v8 v8.11.5 github.com/karlseguin/ccache/v2 v2.0.8 - github.com/onsi/ginkgo v1.16.5 // indirect github.com/onsi/gomega v1.19.0 // indirect github.com/smartystreets/goconvey v1.7.2 gorm.io/driver/mysql v1.3.3 diff --git a/go.sum b/go.sum index cb89605..4495ed3 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,6 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cu github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-redis/redis v6.15.9+incompatible h1:K0pv1D7EQUjfyoMql+r/jZqCLizCGKFlFgcHWWmHQjg= -github.com/go-redis/redis v6.15.9+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE= diff --git a/testkit/functionality_test.go b/testkit/functionality_test.go index b946418..0d577dc 100644 --- a/testkit/functionality_test.go +++ b/testkit/functionality_test.go @@ -26,6 +26,8 @@ func TestSearchCacheFunctionality(t *testing.T) { testFind(searchCache, searchDB) + testPluck(searchCache, searchDB) + testSearchFind(searchCache, searchDB) testSearchCreate(searchCache, searchDB) diff --git a/testkit/test_query.go b/testkit/test_query.go index 1ebe89f..3d25aed 100644 --- a/testkit/test_query.go +++ b/testkit/test_query.go @@ -55,6 +55,23 @@ func testFind(cache *cache.Gorm2Cache, db *gorm.DB) { So(models[1].Value1, ShouldEqual, 2) } +func testPluck(cache *cache.Gorm2Cache, db *gorm.DB) { + err := cache.ResetCache() + So(err, ShouldBeNil) + So(cache.GetHitCount(), ShouldEqual, 0) + + rawInts := make([]int64, 0) + result := db.Model(&TestModel{}).Where("id IN (?)", []int{1, 2}).Pluck("value1", &rawInts) + So(result.Error, ShouldBeNil) + So(cache.GetHitCount(), ShouldEqual, 0) + + cacheInts := make([]int64, 0) + result = db.Model(&TestModel{}).Where("id IN (?)", []int{1, 2}).Pluck("value1", &cacheInts) + So(result.Error, ShouldBeNil) + So(cache.GetHitCount(), ShouldEqual, 1) + So(cacheInts, ShouldResemble, rawInts) +} + func testPtrFind(cache *cache.Gorm2Cache, db *gorm.DB) { err := cache.ResetCache() So(err, ShouldBeNil)