Skip to content

Commit

Permalink
Added testing and examples for products lister
Browse files Browse the repository at this point in the history
  • Loading branch information
breathbath committed Jun 15, 2020
1 parent 74aa30d commit cefa444
Show file tree
Hide file tree
Showing 4 changed files with 331 additions and 80 deletions.
48 changes: 47 additions & 1 deletion examples/products/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"fmt"
"github.com/erply/api-go-wrapper/pkg/api"
"github.com/erply/api-go-wrapper/pkg/api/auth"
sharedCommon "github.com/erply/api-go-wrapper/pkg/api/common"
"github.com/erply/api-go-wrapper/pkg/api/products"
"net/http"
"time"
Expand All @@ -32,7 +33,13 @@ func main() {
panic(err)
}

fmt.Printf("%+v\n", prods)
fmt.Printf("GetProductsBulk:\n%+v\n", prods)

prods, err = GetProductsInParallel(apiClient)
if err != nil {
panic(err)
}
fmt.Printf("GetProductsInParallel:\n%+v\n", prods)
}

func GetProductsBulk(cl *api.Client) (prods []products.Product, err error) {
Expand Down Expand Up @@ -65,3 +72,42 @@ func GetProductsBulk(cl *api.Client) (prods []products.Product, err error) {

return
}

func GetProductsInParallel(cl *api.Client) ([]products.Product, error) {
productsDataProvider := products.NewListingDataProvider(cl.ProductManager)

lister := sharedCommon.NewLister(
sharedCommon.ListingSettings{
MaxRequestsCountPerSecond: 5,
StreamBufferLength: 10,
MaxItemsPerRequest: 10,
MaxFetchersCount: 2,
},
productsDataProvider,
func(sleepTime time.Duration) {
time.Sleep(sleepTime)
},
)

ctx, cancel := context.WithTimeout(context.Background(), time.Second * 5)
defer cancel()

prodsChan := lister.Get(ctx, map[string]interface{}{})

prods := make([]products.Product, 0)
var err error
doneChan := make(chan struct{}, 1)
go func() {
defer close(doneChan)
for prod := range prodsChan {
if prod.Err != nil {
err = prod.Err
return
}
prods = append(prods, prod.Payload.(products.Product))
}
}()

<-doneChan
return prods, err
}
16 changes: 3 additions & 13 deletions pkg/api/common/listing.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ type ItemsStream chan Item
type Item struct {
Err error
TotalCount int
ProgressCount int
Payload interface{}
}

Expand All @@ -35,8 +34,8 @@ func setListingSettingsDefaults(settingsFromInput ListingSettings) ListingSettin
settingsFromInput.MaxRequestsCountPerSecond = DefaultMaxRequestsCountPerSecond
}

if settingsFromInput.MaxItemsPerRequest == 0 || settingsFromInput.MaxItemsPerRequest > MaxCountPerBulkRequestItem {
settingsFromInput.MaxItemsPerRequest = MaxCountPerBulkRequestItem
if settingsFromInput.MaxItemsPerRequest == 0 || settingsFromInput.MaxItemsPerRequest > MaxCountPerBulkRequestItem * MaxCountPerBulkRequestItem {
settingsFromInput.MaxItemsPerRequest = MaxCountPerBulkRequestItem * MaxCountPerBulkRequestItem
}

if settingsFromInput.MaxFetchersCount == 0 {
Expand Down Expand Up @@ -131,25 +130,21 @@ func (p *Lister) getCursors(ctx context.Context, totalCount int) chan []Cursor {
p.listingSettings.MaxItemsPerRequest = MaxCountPerBulkRequestItem*MaxBulkRequestsCount
}

for ; leftCount > 0; { //leftCount 1000, p.listingSettings.MaxItemsPerRequest 100
for ; leftCount > 0; {
countToFetchForBulkRequest := leftCount
if leftCount > p.listingSettings.MaxItemsPerRequest {
countToFetchForBulkRequest = p.listingSettings.MaxItemsPerRequest
}

//countToFetchForBulkRequest 100

bulkItemsCount := CeilDivisionInt(countToFetchForBulkRequest, MaxCountPerBulkRequestItem)
if bulkItemsCount > MaxBulkRequestsCount {
bulkItemsCount = MaxBulkRequestsCount
}
//bulkItemsCount 1

limit := CeilDivisionInt(p.listingSettings.MaxItemsPerRequest, bulkItemsCount)
if limit > MaxCountPerBulkRequestItem {
limit = MaxCountPerBulkRequestItem
}
//limit 100

cursorsForBulkRequest := make([]Cursor, 0, bulkItemsCount)
for i := 0; i < bulkItemsCount; i++ {
Expand Down Expand Up @@ -244,8 +239,3 @@ func (p *Lister) mergeChannels(ctx context.Context, childChans ...ItemsStream) I
func CeilDivisionInt(x, y int) int {
return int(math.Ceil(float64(x) / float64(y)))
}

func AddDefaultPaginationOption(filters map[string]interface{}, limit, page int) {
filters["recordsOnPage"] = limit
filters["pageNo"] = page
}
Loading

0 comments on commit cefa444

Please sign in to comment.