issue-28: added default limit as a setting (#29)
This commit is contained in:
parent
93ec519127
commit
efdc7f9e25
11 changed files with 194 additions and 148 deletions
|
|
@ -18,6 +18,7 @@ type TableProvider interface {
|
|||
PutItems(ctx context.Context, name string, items []models.Item) error
|
||||
}
|
||||
|
||||
type ROProvider interface {
|
||||
type ConfigProvider interface {
|
||||
IsReadOnly() (bool, error)
|
||||
DefaultLimit() int
|
||||
}
|
||||
|
|
|
|||
|
|
@ -12,14 +12,14 @@ import (
|
|||
)
|
||||
|
||||
type Service struct {
|
||||
provider TableProvider
|
||||
roProvider ROProvider
|
||||
provider TableProvider
|
||||
configProvider ConfigProvider
|
||||
}
|
||||
|
||||
func NewService(provider TableProvider, roProvider ROProvider) *Service {
|
||||
func NewService(provider TableProvider, roProvider ConfigProvider) *Service {
|
||||
return &Service{
|
||||
provider: provider,
|
||||
roProvider: roProvider,
|
||||
provider: provider,
|
||||
configProvider: roProvider,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -32,10 +32,10 @@ func (s *Service) Describe(ctx context.Context, table string) (*models.TableInfo
|
|||
}
|
||||
|
||||
func (s *Service) Scan(ctx context.Context, tableInfo *models.TableInfo) (*models.ResultSet, error) {
|
||||
return s.doScan(ctx, tableInfo, nil)
|
||||
return s.doScan(ctx, tableInfo, nil, s.configProvider.DefaultLimit())
|
||||
}
|
||||
|
||||
func (s *Service) doScan(ctx context.Context, tableInfo *models.TableInfo, expr models.Queryable) (*models.ResultSet, error) {
|
||||
func (s *Service) doScan(ctx context.Context, tableInfo *models.TableInfo, expr models.Queryable, limit int) (*models.ResultSet, error) {
|
||||
var (
|
||||
filterExpr *expression.Expression
|
||||
runAsQuery bool
|
||||
|
|
@ -54,10 +54,10 @@ func (s *Service) doScan(ctx context.Context, tableInfo *models.TableInfo, expr
|
|||
var results []models.Item
|
||||
if runAsQuery {
|
||||
log.Printf("executing query")
|
||||
results, err = s.provider.QueryItems(ctx, tableInfo.Name, filterExpr, 1000)
|
||||
results, err = s.provider.QueryItems(ctx, tableInfo.Name, filterExpr, limit)
|
||||
} else {
|
||||
log.Printf("executing scan")
|
||||
results, err = s.provider.ScanItems(ctx, tableInfo.Name, filterExpr, 1000)
|
||||
results, err = s.provider.ScanItems(ctx, tableInfo.Name, filterExpr, limit)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
|
|
@ -135,11 +135,11 @@ func (s *Service) Delete(ctx context.Context, tableInfo *models.TableInfo, items
|
|||
}
|
||||
|
||||
func (s *Service) ScanOrQuery(ctx context.Context, tableInfo *models.TableInfo, expr models.Queryable) (*models.ResultSet, error) {
|
||||
return s.doScan(ctx, tableInfo, expr)
|
||||
return s.doScan(ctx, tableInfo, expr, s.configProvider.DefaultLimit())
|
||||
}
|
||||
|
||||
func (s *Service) assertReadWrite() error {
|
||||
b, err := s.roProvider.IsReadOnly()
|
||||
b, err := s.configProvider.IsReadOnly()
|
||||
if err != nil {
|
||||
return err
|
||||
} else if b {
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@ func TestService_Describe(t *testing.T) {
|
|||
t.Run("return details of the table", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
service := tables.NewService(provider, mockedReadOnlyProvider{readOnly: false})
|
||||
service := tables.NewService(provider, mockedConfigProvider{readOnly: false})
|
||||
ti, err := service.Describe(ctx, tableName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
|
|
@ -40,17 +40,30 @@ func TestService_Scan(t *testing.T) {
|
|||
t.Run("return all columns and fields in sorted order", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
service := tables.NewService(provider, mockedReadOnlyProvider{readOnly: false})
|
||||
service := tables.NewService(provider, mockedConfigProvider{readOnly: false})
|
||||
ti, err := service.Describe(ctx, tableName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
rs, err := service.Scan(ctx, ti)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, rs.Items(), 3)
|
||||
|
||||
// Hash first, then range, then columns in alphabetic order
|
||||
assert.Equal(t, rs.TableInfo, ti)
|
||||
assert.Equal(t, rs.Columns(), []string{"pk", "sk", "alpha", "beta", "gamma"})
|
||||
})
|
||||
|
||||
t.Run("should honour default limits", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
|
||||
service := tables.NewService(provider, mockedConfigProvider{readOnly: false, defaultLimit: 2})
|
||||
ti, err := service.Describe(ctx, tableName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
rs, err := service.Scan(ctx, ti)
|
||||
assert.NoError(t, err)
|
||||
assert.Len(t, rs.Items(), 2)
|
||||
})
|
||||
}
|
||||
|
||||
var testData = []testdynamo.TestData{
|
||||
|
|
@ -78,10 +91,18 @@ var testData = []testdynamo.TestData{
|
|||
},
|
||||
}
|
||||
|
||||
type mockedReadOnlyProvider struct {
|
||||
readOnly bool
|
||||
type mockedConfigProvider struct {
|
||||
readOnly bool
|
||||
defaultLimit int
|
||||
}
|
||||
|
||||
func (m mockedReadOnlyProvider) IsReadOnly() (bool, error) {
|
||||
func (m mockedConfigProvider) IsReadOnly() (bool, error) {
|
||||
return m.readOnly, nil
|
||||
}
|
||||
|
||||
func (m mockedConfigProvider) DefaultLimit() int {
|
||||
if m.defaultLimit == 0 {
|
||||
return 1000
|
||||
}
|
||||
return m.defaultLimit
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue