Skip to content
Snippets Groups Projects
Commit 318dcb0e authored by Pavel Antonov's avatar Pavel Antonov :asterisk:
Browse files

Merge branch 'feature/PRXS-951-Log-Revert-Offset' into 'feature/PRXS-951-Log'

Revert "Merge branch 'feature/PRXS-1984-ItemsFindOptions' into 'feature/PRXS-951-Log'"

See merge request perxis/perxis-go!168
parents a0d26b94 455afe75
No related branches found
No related tags found
No related merge requests found
...@@ -302,11 +302,39 @@ func ProtoToPtrItemsFilter(protoFilter *itemspb.Filter) (*items.Filter, error) { ...@@ -302,11 +302,39 @@ func ProtoToPtrItemsFilter(protoFilter *itemspb.Filter) (*items.Filter, error) {
} }
func PtrServicesFindOptionsToProto(options *services.FindOptions) (*common.FindOptions, error) { func PtrServicesFindOptionsToProto(options *services.FindOptions) (*common.FindOptions, error) {
return services.FindOptionsToPB(options), nil if options == nil {
return nil, nil
}
return &common.FindOptions{
Sort: options.Sort,
PageNum: int32(options.PageNum),
PageSize: int32(options.PageSize),
Offset: int32(options.Offset),
Limit: int32(options.Limit),
Fields: options.Fields,
ExcludeFields: options.ExcludeFields,
}, nil
} }
func ProtoToPtrServicesFindOptions(protoOptions *common.FindOptions) (*services.FindOptions, error) { func ProtoToPtrServicesFindOptions(protoOptions *common.FindOptions) (*services.FindOptions, error) {
return services.FindOptionsFromPB(protoOptions), nil if protoOptions == nil {
return nil, nil
}
return &services.FindOptions{
SortOptions: services.SortOptions{
Sort: protoOptions.Sort,
},
PaginationOptions: services.PaginationOptions{
PageNum: int(protoOptions.PageNum),
PageSize: int(protoOptions.PageSize),
Offset: int(protoOptions.Offset),
Limit: int(protoOptions.Limit),
},
FieldOptions: services.FieldOptions{
Fields: protoOptions.Fields,
ExcludeFields: protoOptions.ExcludeFields,
},
}, nil
} }
func ListPtrItemsItemToProto(itms []*items.Item) ([]*itemspb.Item, error) { func ListPtrItemsItemToProto(itms []*items.Item) ([]*itemspb.Item, error) {
......
...@@ -104,18 +104,11 @@ func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pb.FindOptions, ...@@ -104,18 +104,11 @@ func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pb.FindOptions,
if opts == nil { if opts == nil {
return nil, nil return nil, nil
} }
return &pb.FindOptions{
fo := &pb.FindOptions{
Sort: opts.Sort, Sort: opts.Sort,
PageSize: int32(opts.Limit), PageNum: int32(opts.PageNum),
} PageSize: int32(opts.PageSize),
}, nil
if opts.Limit != 0 {
// Потенциальная ошибка если offset не кратен limit
fo.PageNum = int32(opts.Offset / opts.Limit)
}
return fo, nil
} }
func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOptions, error) { func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOptions, error) {
...@@ -127,8 +120,8 @@ func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOpti ...@@ -127,8 +120,8 @@ func ProtoToPtrServicesFindOptions(protoOpts *pb.FindOptions) (*options.FindOpti
Sort: protoOpts.Sort, Sort: protoOpts.Sort,
}, },
PaginationOptions: options.PaginationOptions{ PaginationOptions: options.PaginationOptions{
Limit: int(protoOpts.PageSize), PageNum: int(protoOpts.PageNum),
Offset: int(protoOpts.PageNum * protoOpts.PageSize), PageSize: int(protoOpts.PageSize),
}, },
}, nil }, nil
} }
......
package items
import "context"
type FindResultDummy struct {
Items []*Item
Total int
Error error
}
type Dummy struct {
Items
FindResult *FindResultDummy
}
func (d *Dummy) Find(_ context.Context, _, _, _ string, _ *Filter, _ ...*FindOptions) ([]*Item, int, error) {
return d.FindResult.Items, d.FindResult.Total, d.FindResult.Error
}
...@@ -16,7 +16,9 @@ type BatchProcessor struct { ...@@ -16,7 +16,9 @@ type BatchProcessor struct {
FindPublishedOptions *FindPublishedOptions FindPublishedOptions *FindPublishedOptions
Filter *Filter Filter *Filter
limit int // Deprecated использовать offset, limit
pageSize, pageNum int
sort []string sort []string
processed int processed int
} }
...@@ -37,7 +39,7 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) { ...@@ -37,7 +39,7 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
Regular: b.FindPublishedOptions.Regular, Regular: b.FindPublishedOptions.Regular,
Hidden: b.FindPublishedOptions.Hidden, Hidden: b.FindPublishedOptions.Hidden,
Templates: b.FindPublishedOptions.Templates, Templates: b.FindPublishedOptions.Templates,
FindOptions: *options.New(b.processed, b.limit, b.sort...), FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
}, },
) )
} else { } else {
...@@ -52,13 +54,14 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) { ...@@ -52,13 +54,14 @@ func (b *BatchProcessor) getBatch(ctx context.Context) ([]*Item, bool, error) {
Regular: b.FindOptions.Regular, Regular: b.FindOptions.Regular,
Hidden: b.FindOptions.Hidden, Hidden: b.FindOptions.Hidden,
Templates: b.FindOptions.Templates, Templates: b.FindOptions.Templates,
FindOptions: *options.New(b.processed, b.limit, b.sort...), FindOptions: *options.NewFindOptions(b.pageNum, b.pageSize, b.sort...),
}, },
) )
} }
if err == nil { if err == nil {
b.processed += len(res) b.processed += len(res)
b.pageNum++
} }
return res, b.processed != total, err return res, b.processed != total, err
...@@ -83,29 +86,32 @@ func (b *BatchProcessor) next(ctx context.Context) (res []*Item, next bool, err ...@@ -83,29 +86,32 @@ func (b *BatchProcessor) next(ctx context.Context) (res []*Item, next bool, err
} }
func (b *BatchProcessor) reducePageSize() bool { func (b *BatchProcessor) reducePageSize() bool {
if b.limit == 1 { if b.pageSize == 1 {
return false return false
} }
b.limit /= 2 b.pageNum = 2 * b.pageNum
b.pageSize = b.pageSize / 2
return true return true
} }
func (b *BatchProcessor) Do(ctx context.Context, f func(batch []*Item) error) (int, error) { func (b *BatchProcessor) Do(ctx context.Context, f func(batch []*Item) error) (int, error) {
if b.FindOptions == nil && b.FindPublishedOptions == nil { if b.FindOptions == nil && b.FindPublishedOptions == nil {
b.FindOptions = new(FindOptions) b.FindOptions = new(FindOptions)
} }
if b.FindOptions != nil { if b.FindOptions != nil {
b.limit = b.FindOptions.Limit b.pageSize = b.FindOptions.PageSize
b.sort = b.FindOptions.Sort b.sort = b.FindOptions.Sort
} }
if b.FindPublishedOptions != nil { if b.FindPublishedOptions != nil {
b.limit = b.FindPublishedOptions.Limit b.pageSize = b.FindPublishedOptions.PageSize
b.sort = b.FindPublishedOptions.Sort b.sort = b.FindPublishedOptions.Sort
} }
if b.limit == 0 { if b.pageSize == 0 {
b.limit = 128 b.pageSize = 128
} }
if b.Filter != nil && (len(b.Filter.ID) > 0 || len(b.Filter.Q) > 0) && !data.Contains("_id", b.sort) { if b.Filter != nil && (len(b.Filter.ID) > 0 || len(b.Filter.Q) > 0) && !data.Contains("_id", b.sort) {
......
...@@ -11,12 +11,8 @@ import ( ...@@ -11,12 +11,8 @@ import (
) )
func TestBatchProcessor(t *testing.T) { func TestBatchProcessor(t *testing.T) {
t.Run("EmptyResults", func(t *testing.T) {
itemssvc := &Stub{ itemssvc := &Dummy{FindResult: &FindResultDummy{Items: nil, Total: 0, Error: nil}}
FindResult: func(req StubFindRequest) StubFindResult {
return StubFindResult{Items: nil, Total: 0, Error: nil}
},
}
b := &BatchProcessor{ b := &BatchProcessor{
Items: itemssvc, Items: itemssvc,
...@@ -36,26 +32,4 @@ func TestBatchProcessor(t *testing.T) { ...@@ -36,26 +32,4 @@ func TestBatchProcessor(t *testing.T) {
_, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil }) _, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil })
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, 0, counter) assert.Equal(t, 0, counter)
})
t.Run("With FindOptions", func(t *testing.T) {
itemssvc := &Stub{
FindResult: func(req StubFindRequest) StubFindResult {
fo := MergeFindOptions(req.Options...)
return StubFindResult{Items: make([]*Item, fo.Limit), Total: 1000, Error: nil}
},
}
b := &BatchProcessor{
Items: itemssvc,
SpaceID: "sp",
EnvID: environments.DefaultEnvironment,
CollectionID: "col",
FindOptions: &FindOptions{FindOptions: *options.New(0, 25)},
}
var counter int
_, err := b.Do(context.Background(), func(batch []*Item) error { counter++; return nil })
require.NoError(t, err)
assert.Equal(t, 1000/25, counter)
})
} }
package items
import (
"context"
)
type StubFindRequest struct {
Context context.Context
SpaceID, EnvID, CollID string
Filter *Filter
Options []*FindOptions
}
type StubFindResult struct {
Items []*Item
Total int
Error error
}
type Stub struct {
Items
FindResult func(req StubFindRequest) StubFindResult
}
func (d *Stub) Find(ctx context.Context, spaceID, envID, collID string, filter *Filter, opts ...*FindOptions) ([]*Item, int, error) {
res := d.FindResult(StubFindRequest{
Context: ctx,
SpaceID: spaceID,
EnvID: envID,
CollID: collID,
Filter: filter,
Options: opts,
})
return res.Items, res.Total, res.Error
}
...@@ -144,11 +144,39 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*service.Filter, error) { ...@@ -144,11 +144,39 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*service.Filter, error) {
} }
func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pbcommon.FindOptions, error) { func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*pbcommon.FindOptions, error) {
return options.FindOptionsToPB(opts), nil if opts == nil {
return nil, nil
}
return &pbcommon.FindOptions{
Sort: opts.Sort,
PageNum: int32(opts.PageNum),
PageSize: int32(opts.PageSize),
Offset: int32(opts.Offset),
Limit: int32(opts.Limit),
Fields: opts.Fields,
ExcludeFields: opts.ExcludeFields,
}, nil
} }
func ProtoToPtrServicesFindOptions(protoOpts *pbcommon.FindOptions) (*options.FindOptions, error) { func ProtoToPtrServicesFindOptions(protoOpts *pbcommon.FindOptions) (*options.FindOptions, error) {
return options.FindOptionsFromPB(protoOpts), nil if protoOpts == nil {
return nil, nil
}
return &options.FindOptions{
SortOptions: options.SortOptions{
Sort: protoOpts.Sort,
},
PaginationOptions: options.PaginationOptions{
PageNum: int(protoOpts.PageNum),
PageSize: int(protoOpts.PageSize),
Offset: int(protoOpts.Offset),
Limit: int(protoOpts.Limit),
},
FieldOptions: options.FieldOptions{
Fields: protoOpts.Fields,
ExcludeFields: protoOpts.ExcludeFields,
},
}, nil
} }
func ListPtrItemToProto(items []*service.Item) ([]*pb.Item, error) { func ListPtrItemToProto(items []*service.Item) ([]*pb.Item, error) {
......
...@@ -13,6 +13,10 @@ type SortOptions struct { ...@@ -13,6 +13,10 @@ type SortOptions struct {
// PaginationOptions настройки возвращаемых страниц результатов // PaginationOptions настройки возвращаемых страниц результатов
type PaginationOptions struct { type PaginationOptions struct {
//Deprecated
PageNum int
PageSize int
Limit int Limit int
Offset int Offset int
} }
...@@ -35,18 +39,12 @@ type FindOptions struct { ...@@ -35,18 +39,12 @@ type FindOptions struct {
FieldOptions FieldOptions
} }
// Deprecated использовать New
// NewFindOptions создает новые результаты поиска // NewFindOptions создает новые результаты поиска
func NewFindOptions(pageNum, pageSize int, sort ...string) *FindOptions { func NewFindOptions(pageNum, pageSize int, sort ...string) *FindOptions {
return New(pageNum*pageSize, pageSize, sort...)
}
// New создает новые параметры поиска
func New(offset, limit int, sort ...string) *FindOptions {
return &FindOptions{ return &FindOptions{
PaginationOptions: PaginationOptions{ PaginationOptions: PaginationOptions{
Offset: offset, PageNum: pageNum,
Limit: limit, PageSize: pageSize,
}, },
SortOptions: SortOptions{ SortOptions: SortOptions{
Sort: sort, Sort: sort,
...@@ -97,8 +95,8 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions { ...@@ -97,8 +95,8 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions {
Sort: protoOpts.Sort, Sort: protoOpts.Sort,
}, },
PaginationOptions: PaginationOptions{ PaginationOptions: PaginationOptions{
Limit: int(protoOpts.Limit),
Offset: int(protoOpts.Offset), Offset: int(protoOpts.Offset),
Limit: int(protoOpts.Limit),
}, },
FieldOptions: FieldOptions{ FieldOptions: FieldOptions{
Fields: protoOpts.Fields, Fields: protoOpts.Fields,
...@@ -106,9 +104,9 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions { ...@@ -106,9 +104,9 @@ func FindOptionsFromPB(protoOpts *commonpb.FindOptions) *FindOptions {
}, },
} }
if fo.Offset == 0 && fo.Limit == 0 { if fo.Offset == 0 && fo.Limit == 0 && fo.PageSize != 0 {
fo.Offset = int(protoOpts.PageSize * protoOpts.PageNum) fo.Offset = fo.PageSize * (fo.PageNum - 1)
fo.Limit = int(protoOpts.PageSize) fo.Limit = fo.PageSize
} }
return fo return fo
...@@ -120,11 +118,21 @@ func FindOptionsToPB(opts *FindOptions) *commonpb.FindOptions { ...@@ -120,11 +118,21 @@ func FindOptionsToPB(opts *FindOptions) *commonpb.FindOptions {
} }
fo := &commonpb.FindOptions{ fo := &commonpb.FindOptions{
Sort: opts.Sort, Sort: opts.Sort,
PageNum: int32(opts.PageNum),
PageSize: int32(opts.PageSize),
Offset: int32(opts.Offset), Offset: int32(opts.Offset),
Limit: int32(opts.Limit), Limit: int32(opts.Limit),
Fields: opts.Fields, Fields: opts.Fields,
ExcludeFields: opts.ExcludeFields, ExcludeFields: opts.ExcludeFields,
} }
if fo.PageSize != 0 && fo.Limit == 0 {
fo.Limit = fo.PageSize
fo.Offset = fo.PageSize * (fo.PageNum - 1)
}
if fo.Limit != 0 && fo.PageSize == 0 {
fo.PageSize = fo.Limit
fo.PageNum = fo.Offset / fo.Limit
}
return fo return fo
} }
...@@ -148,9 +156,11 @@ func MergeSortOptions(options ...SortOptions) SortOptions { ...@@ -148,9 +156,11 @@ func MergeSortOptions(options ...SortOptions) SortOptions {
func MergePaginationOptions(options ...PaginationOptions) PaginationOptions { func MergePaginationOptions(options ...PaginationOptions) PaginationOptions {
fo := PaginationOptions{} fo := PaginationOptions{}
for _, opt := range options { for _, opt := range options {
if opt.Offset == 0 && opt.Limit == 0 { if opt.PageSize == 0 && opt.PageNum == 0 && opt.Offset == 0 && opt.Limit == 0 {
continue continue
} }
fo.PageNum = opt.PageNum
fo.PageSize = opt.PageSize
fo.Offset = opt.Offset fo.Offset = opt.Offset
fo.Limit = opt.Limit fo.Limit = opt.Limit
} }
......
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
) )
func TestOptions_MergePaginationOptions(t *testing.T) { func TestOptions_MergePaginationOptions(t *testing.T) {
var tt = []struct { var tt = []struct {
name string name string
options []PaginationOptions options []PaginationOptions
...@@ -23,29 +24,29 @@ func TestOptions_MergePaginationOptions(t *testing.T) { ...@@ -23,29 +24,29 @@ func TestOptions_MergePaginationOptions(t *testing.T) {
expected: PaginationOptions{}, expected: PaginationOptions{},
}, },
{ {
name: "One limit/offset option", name: "One option",
options: []PaginationOptions{{Limit: 10, Offset: 100}}, options: []PaginationOptions{{PageNum: 10, PageSize: 100}},
expected: PaginationOptions{Limit: 10, Offset: 100}, expected: PaginationOptions{PageNum: 10, PageSize: 100},
}, },
{ {
name: "Merge limit/offset #1", name: "Merge #1",
options: []PaginationOptions{{Limit: 0, Offset: 0}, {Limit: 10, Offset: 100}}, options: []PaginationOptions{{PageNum: 0, PageSize: 0}, {PageNum: 10, PageSize: 100}},
expected: PaginationOptions{Limit: 10, Offset: 100}, expected: PaginationOptions{PageNum: 10, PageSize: 100},
}, },
{ {
name: "Merge limit/offset #2", name: "Merge #2",
options: []PaginationOptions{{Limit: 10, Offset: 100}, {Limit: 0, Offset: 0}}, options: []PaginationOptions{{PageNum: 10, PageSize: 100}, {PageNum: 0, PageSize: 0}},
expected: PaginationOptions{Limit: 10, Offset: 100}, expected: PaginationOptions{PageNum: 10, PageSize: 100},
}, },
{ {
name: "Merge limit/offset #3", name: "Merge #3",
options: []PaginationOptions{{Limit: 0, Offset: 0}, {Limit: 10, Offset: 100}, {Limit: 0, Offset: 0}}, options: []PaginationOptions{{PageNum: 0, PageSize: 0}, {PageNum: 10, PageSize: 100}, {PageNum: 0, PageSize: 0}},
expected: PaginationOptions{Limit: 10, Offset: 100}, expected: PaginationOptions{PageNum: 10, PageSize: 100},
}, },
{ {
name: "Merge limit/offset #4", name: "Merge #4",
options: []PaginationOptions{{Limit: 10, Offset: 100}, {}}, options: []PaginationOptions{{PageNum: 10, PageSize: 100}, {}},
expected: PaginationOptions{Limit: 10, Offset: 100}, expected: PaginationOptions{PageNum: 10, PageSize: 100},
}, },
} }
......
...@@ -61,11 +61,33 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*organizations.Filter, error) { ...@@ -61,11 +61,33 @@ func ProtoToPtrFilter(protoFilter *pb.Filter) (*organizations.Filter, error) {
} }
func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) { func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) {
return options.FindOptionsToPB(opts), nil if opts == nil {
return nil, nil
}
return &common.FindOptions{
Sort: opts.Sort,
PageNum: int32(opts.PageNum),
PageSize: int32(opts.PageSize),
Offset: int32(opts.Offset),
Limit: int32(opts.Limit),
}, nil
} }
func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) { func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) {
return options.FindOptionsFromPB(protoOpts), nil if protoOpts == nil {
return nil, nil
}
return &options.FindOptions{
SortOptions: options.SortOptions{
Sort: protoOpts.Sort,
},
PaginationOptions: options.PaginationOptions{
PageNum: int(protoOpts.PageNum),
PageSize: int(protoOpts.PageSize),
Offset: int(protoOpts.Offset),
Limit: int(protoOpts.Limit),
},
}, nil
} }
func ListPtrOrganizationToProto(orgs []*organizations.Organization) ([]*pb.Organization, error) { func ListPtrOrganizationToProto(orgs []*organizations.Organization) ([]*pb.Organization, error) {
......
...@@ -127,9 +127,27 @@ func ProtoToListPtrUser(protoCreates []*pb.User) ([]*service.User, error) { ...@@ -127,9 +127,27 @@ func ProtoToListPtrUser(protoCreates []*pb.User) ([]*service.User, error) {
} }
func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) { func PtrServicesFindOptionsToProto(opts *options.FindOptions) (*common.FindOptions, error) {
return options.FindOptionsToPB(opts), nil if opts == nil {
return nil, nil
}
return &common.FindOptions{
Sort: opts.Sort,
PageNum: int32(opts.PageNum),
PageSize: int32(opts.PageSize),
}, nil
} }
func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) { func ProtoToPtrServicesFindOptions(protoOpts *common.FindOptions) (*options.FindOptions, error) {
return options.FindOptionsFromPB(protoOpts), nil if protoOpts == nil {
return nil, nil
}
return &options.FindOptions{
SortOptions: options.SortOptions{
Sort: protoOpts.Sort,
},
PaginationOptions: options.PaginationOptions{
PageNum: int(protoOpts.PageNum),
PageSize: int(protoOpts.PageSize),
},
}, nil
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment