From 3b940253b4fd551714672c5b7fc04737691096df Mon Sep 17 00:00:00 2001
From: Danis Kirasirov <dbgbbu@gmail.com>
Date: Tue, 13 Feb 2024 17:33:32 +0300
Subject: [PATCH] =?UTF-8?q?=D0=98=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7?=
 =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20offset/limit=20=D0=B2=20?=
 =?UTF-8?q?items.BatchProcessor?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 pkg/items/pagination.go | 30 +++++++++++++++---------------
 pkg/options/options.go  | 10 ++++++++--
 2 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/pkg/items/pagination.go b/pkg/items/pagination.go
index 0c07c415..de9354a3 100644
--- a/pkg/items/pagination.go
+++ b/pkg/items/pagination.go
@@ -16,9 +16,7 @@ type BatchProcessor struct {
 	FindPublishedOptions         *FindPublishedOptions
 	Filter                       *Filter
 
-	// Deprecated использовать offset, limit
-	pageSize, pageNum int
-
+	limit int
 	sort      []string
 	processed int
 }
@@ -39,7 +37,7 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
 				Regular:     b.FindPublishedOptions.Regular,
 				Hidden:      b.FindPublishedOptions.Hidden,
 				Templates:   b.FindPublishedOptions.Templates,
-				FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
+				FindOptions: *options.GetFindOptions(b.processed, b.limit, b.sort...),
 			},
 		)
 	} else {
@@ -54,14 +52,13 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
 				Regular:     b.FindOptions.Regular,
 				Hidden:      b.FindOptions.Hidden,
 				Templates:   b.FindOptions.Templates,
-				FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
+				FindOptions: *options.GetFindOptions(b.processed, b.limit, b.sort...),
 			},
 		)
 	}
 
 	if err == nil {
 		b.processed += len(res)
-		b.pageNum++
 	}
 
 	return res, b.processed != total, err
@@ -86,32 +83,35 @@ func (b *BatchProcessor) next(ctx context.Context) (res []*Item, next bool, err
 }
 
 func (b *BatchProcessor) reducePageSize() bool {
-	if b.pageSize == 1 {
+	if b.limit == 1 {
 		return false
 	}
 
-	b.pageNum = 2 * b.pageNum
-	b.pageSize = b.pageSize / 2
-
+	b.limit /= 2
 	return true
 }
 
 func (b *BatchProcessor) Do(ctx context.Context, f func(batch []*Item) error) (int, error) {
-
 	if b.FindOptions == nil && b.FindPublishedOptions == nil {
 		b.FindOptions = new(FindOptions)
 	}
 	if b.FindOptions != nil {
-		b.pageSize = b.FindOptions.PageSize
+		b.limit = b.FindOptions.PageSize
 		b.sort = b.FindOptions.Sort
+		if b.FindOptions.Limit != 0 {
+			b.limit = b.FindOptions.Limit
+		}
 	}
 	if b.FindPublishedOptions != nil {
-		b.pageSize = b.FindPublishedOptions.PageSize
+		b.limit = b.FindPublishedOptions.PageSize
 		b.sort = b.FindPublishedOptions.Sort
+		if b.FindPublishedOptions.Limit != 0 {
+			b.limit = b.FindPublishedOptions.Limit
+		}
 	}
 
-	if b.pageSize == 0 {
-		b.pageSize = 128
+	if b.limit == 0 {
+		b.limit = 128
 	}
 
 	if b.Filter != nil && (len(b.Filter.ID) > 0 || len(b.Filter.Q) > 0) && !data.Contains("_id", b.sort) {
diff --git a/pkg/options/options.go b/pkg/options/options.go
index d1e79608..6de164ac 100644
--- a/pkg/options/options.go
+++ b/pkg/options/options.go
@@ -39,12 +39,18 @@ type FindOptions struct {
 	FieldOptions
 }
 
+// Deprecated использовать GetFindOptions
 // NewFindOptions создает новые результаты поиска
 func NewFindOptions(pageNum, pageSize int, sort ...string) *FindOptions {
+	return GetFindOptions(pageNum*pageSize, pageSize, sort...)
+}
+
+// GetFindOptions создает новые параметры поиска
+func GetFindOptions(offset, limit int, sort ...string) *FindOptions {
 	return &FindOptions{
 		PaginationOptions: PaginationOptions{
-			PageNum:  pageNum,
-			PageSize: pageSize,
+			Offset: offset,
+			Limit:  limit,
 		},
 		SortOptions: SortOptions{
 			Sort: sort,
-- 
GitLab