From eab6db83ebd75f30c547da1b6adcaecc63b6ceba Mon Sep 17 00:00:00 2001 From: xing Date: Mon, 27 Feb 2023 21:34:48 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E9=A1=B5=E5=99=A8=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/pkg/dao/posts.go | 4 +++- model/condition.go | 7 ------- model/query.go | 35 ++++++++++++++++------------------- model/query_test.go | 36 +++++++++++++++++++++--------------- model/querycondition.go | 16 ++++++++-------- model/querycondition_test.go | 14 ++++++++------ 6 files changed, 56 insertions(+), 56 deletions(-) diff --git a/internal/pkg/dao/posts.go b/internal/pkg/dao/posts.go index 47ac1b1..64007d1 100644 --- a/internal/pkg/dao/posts.go +++ b/internal/pkg/dao/posts.go @@ -92,8 +92,10 @@ func GetPostsByIds(a ...any) (m map[uint64]models.Posts, err error) { func SearchPostIds(args ...any) (ids PostIds, err error) { ctx := args[0].(context.Context) q := args[1].(model.QueryCondition) + page := args[2].(int) + pageSize := args[3].(int) q.Fields = "ID" - res, total, err := model.Pagination[models.Posts](ctx, q) + res, total, err := model.Pagination[models.Posts](ctx, q, page, pageSize) for _, posts := range res { ids.Ids = append(ids.Ids, posts.Id) } diff --git a/model/condition.go b/model/condition.go index f142448..ffa772b 100644 --- a/model/condition.go +++ b/model/condition.go @@ -8,7 +8,6 @@ type QueryCondition struct { Order SqlBuilder Join SqlBuilder Having SqlBuilder - Page int Limit int Offset int In [][]any @@ -68,12 +67,6 @@ func Having(having SqlBuilder) Condition { } } -func Page(page int) Condition { - return func(c *QueryCondition) { - c.Page = page - } -} - func Limit(limit int) Condition { return func(c *QueryCondition) { c.Limit = limit diff --git a/model/query.go b/model/query.go index edd18f4..b8dad98 100644 --- a/model/query.go +++ b/model/query.go @@ -9,10 +9,11 @@ import ( "strings" ) -func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []T, total int, err error) { - if q.Page < 1 { +func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []T, total int, err error) { + if page < 1 || pageSize < 1 { return } + q.Limit = pageSize qx := QueryCondition{ Where: q.Where, Having: q.Having, @@ -42,45 +43,41 @@ func pagination[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r [ return } offset := 0 - if q.Page > 1 { - offset = (q.Page - 1) * q.Limit + if page > 1 { + offset = (page - 1) * q.Limit } if offset >= total { return } q.Offset = offset - m := ctx.Value("handle=>") + m := ctx.Value("handle=>toMap") if m == nil { r, err = finds[T](db, ctx, q) return } - mm, ok := m.(string) - if ok && mm == "toMap" { - v := ctx.Value("map") + mm, ok := m.(*[]map[string]string) + if ok { mx, er := findToStringMap[T](db, ctx, q) if er != nil { err = er return } - vv := v.(*[]map[string]string) - *vv = mx - return + *mm = mx } return } -func paginationToMap[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) { - ctx = context.WithValue(ctx, "handle=>", "toMap") - ctx = context.WithValue(ctx, "map", &r) - _, total, err = pagination[T](db, ctx, q) +func paginationToMap[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) { + ctx = context.WithValue(ctx, "handle=>toMap", &r) + _, total, err = pagination[T](db, ctx, q, page, pageSize) return } -func PaginationToMap[T Model](ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) { - return paginationToMap[T](globalBb, ctx, q) +func PaginationToMap[T Model](ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) { + return paginationToMap[T](globalBb, ctx, q, page, pageSize) } -func PaginationToMapFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition) (r []map[string]string, total int, err error) { - return paginationToMap[T](db, ctx, q) +func PaginationToMapFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) (r []map[string]string, total int, err error) { + return paginationToMap[T](db, ctx, q, page, pageSize) } func FindOneById[T Model, I constraints.Integer](ctx context.Context, id I) (T, error) { diff --git a/model/query_test.go b/model/query_test.go index b588455..756558e 100644 --- a/model/query_test.go +++ b/model/query_test.go @@ -465,9 +465,11 @@ func TestSimpleFind(t *testing.T) { func Test_pagination(t *testing.T) { type args struct { - db dbQuery - ctx context.Context - q QueryCondition + db dbQuery + ctx context.Context + q QueryCondition + page int + pageSize int } type testCase[T Model] struct { name string @@ -487,10 +489,12 @@ func Test_pagination(t *testing.T) { Group: "post_type", Having: SqlBuilder{{"ID", ">", "1", "int"}}, }, + page: 1, + pageSize: 2, }, wantR: func() (r []post) { - err := glob.Selects(ctx, &r, "select post_type,count(*) ID from wp_posts group by post_type having `ID`> 1") + err := glob.Selects(ctx, &r, "select post_type,count(*) ID from wp_posts group by post_type having `ID`> 1 limit 2") if err != nil { panic(err) } @@ -502,7 +506,7 @@ func Test_pagination(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotR, gotTotal, err := pagination[post](tt.args.db, tt.args.ctx, tt.args.q) + gotR, gotTotal, err := pagination[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize) if (err != nil) != tt.wantErr { t.Errorf("pagination() error = %v, wantErr %v", err, tt.wantErr) return @@ -519,9 +523,11 @@ func Test_pagination(t *testing.T) { func Test_paginationToMap(t *testing.T) { type args struct { - db dbQuery - ctx context.Context - q QueryCondition + db dbQuery + ctx context.Context + q QueryCondition + page int + pageSize int } tests := []struct { name string @@ -537,10 +543,10 @@ func Test_paginationToMap(t *testing.T) { ctx: ctx, q: QueryCondition{ Fields: "ID", - Limit: 2, - Page: 1, Where: SqlBuilder{{"ID < 200"}}, }, + page: 1, + pageSize: 2, }, wantR: []map[string]string{{"ID": "63"}, {"ID": "64"}}, wantTotal: 4, @@ -552,10 +558,10 @@ func Test_paginationToMap(t *testing.T) { ctx: ctx, q: QueryCondition{ Fields: "ID", - Limit: 2, - Page: 2, Where: SqlBuilder{{"ID < 200"}}, }, + page: 2, + pageSize: 2, }, wantR: []map[string]string{{"ID": "190"}, {"ID": "193"}}, wantTotal: 4, @@ -563,11 +569,11 @@ func Test_paginationToMap(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotR, gotTotal, err := PaginationToMap[post](tt.args.ctx, tt.args.q) + gotR, gotTotal, err := PaginationToMap[post](tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize) fmt.Println(gotR, gotTotal, err) - gotR, gotTotal, err = PaginationToMapFromDB[post](tt.args.db, tt.args.ctx, tt.args.q) + gotR, gotTotal, err = PaginationToMapFromDB[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize) fmt.Println(gotR, gotTotal, err) - gotR, gotTotal, err = paginationToMap[post](tt.args.db, tt.args.ctx, tt.args.q) + gotR, gotTotal, err = paginationToMap[post](tt.args.db, tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize) if (err != nil) != tt.wantErr { t.Errorf("paginationToMap() error = %v, wantErr %v", err, tt.wantErr) diff --git a/model/querycondition.go b/model/querycondition.go index e1b703f..26bdeb8 100644 --- a/model/querycondition.go +++ b/model/querycondition.go @@ -41,7 +41,7 @@ func chunkFind[T Model](db dbQuery, ctx context.Context, perLimit int, q QueryCo var offset int for { if 1 == i { - rr, total, err = pagination[T](db, ctx, q) + rr, total, err = pagination[T](db, ctx, q, 1, perLimit) } else { q.Offset = offset q.Limit = perLimit @@ -100,7 +100,7 @@ func chunk[T Model, R any](db dbQuery, ctx context.Context, perLimit int, fn fun var offset int for { if 1 == i { - rr, total, err = pagination[T](db, ctx, q) + rr, total, err = pagination[T](db, ctx, q, 1, perLimit) } else { q.Offset = offset q.Limit = perLimit @@ -127,16 +127,16 @@ func chunk[T Model, R any](db dbQuery, ctx context.Context, perLimit int, fn fun // Pagination 同 // -// Condition 中可使用 Where Fields From Group Having Join Order Page Limit In 函数 -func Pagination[T Model](ctx context.Context, q QueryCondition) ([]T, int, error) { - return pagination[T](globalBb, ctx, q) +// Condition 中可使用 Where Fields From Group Having Join Order Limit In 函数 +func Pagination[T Model](ctx context.Context, q QueryCondition, page, pageSize int) ([]T, int, error) { + return pagination[T](globalBb, ctx, q, page, pageSize) } // PaginationFromDB 同 Pagination 方便多个db使用 // -// Condition 中可使用 Where Fields Group Having Join Order Page Limit In 函数 -func PaginationFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition) ([]T, int, error) { - return pagination[T](db, ctx, q) +// Condition 中可使用 Where Fields Group Having Join Order Limit In 函数 +func PaginationFromDB[T Model](db dbQuery, ctx context.Context, q QueryCondition, page, pageSize int) ([]T, int, error) { + return pagination[T](db, ctx, q, page, pageSize) } func Column[V Model, T any](ctx context.Context, fn func(V) (T, bool), q QueryCondition) ([]T, error) { diff --git a/model/querycondition_test.go b/model/querycondition_test.go index ae303f1..95677ba 100644 --- a/model/querycondition_test.go +++ b/model/querycondition_test.go @@ -178,8 +178,10 @@ func TestChunk(t *testing.T) { func TestPagination(t *testing.T) { type args struct { - ctx context.Context - q QueryCondition + ctx context.Context + q QueryCondition + page int + pageSize int } type testCase[T Model] struct { name string @@ -197,10 +199,10 @@ func TestPagination(t *testing.T) { Where(SqlBuilder{ {"ID", "in", ""}, }), - Page(1), - Limit(5), In([][]any{slice.ToAnySlice(number.Range(431, 440, 1))}...), ), + page: 1, + pageSize: 5, }, want: func() (r []post) { r, err := Select[post](ctx, "select * from "+post{}.Table()+" where ID in (?,?,?,?,?)", slice.ToAnySlice(number.Range(431, 435, 1))...) @@ -217,7 +219,7 @@ func TestPagination(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, got1, err := Pagination[post](tt.args.ctx, tt.args.q) + got, got1, err := Pagination[post](tt.args.ctx, tt.args.q, tt.args.page, tt.args.pageSize) if (err != nil) != tt.wantErr { t.Errorf("Pagination() error = %v, wantErr %v", err, tt.wantErr) return @@ -333,7 +335,7 @@ func Test_getField(t *testing.T) { db := glob field := "count(*)" q := Conditions() - wantR := "385" + wantR := "406" wantErr := false t.Run(name, func(t *testing.T) { gotR, err := getField[options](db, ctx, field, q)