Modified put to put all dirty or marked items
This commit is contained in:
parent
9fee17a6a6
commit
2dbd664dd2
13 changed files with 329 additions and 167 deletions
|
|
@ -14,4 +14,5 @@ type TableProvider interface {
|
|||
ScanItems(ctx context.Context, tableName string, filterExpr *expression.Expression, maxItems int) ([]models.Item, error)
|
||||
DeleteItem(ctx context.Context, tableName string, key map[string]types.AttributeValue) error
|
||||
PutItem(ctx context.Context, name string, item models.Item) error
|
||||
PutItems(ctx context.Context, name string, items []models.Item) error
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package tables
|
|||
import (
|
||||
"context"
|
||||
"github.com/aws/aws-sdk-go-v2/feature/dynamodb/expression"
|
||||
"github.com/lmika/awstools/internal/common/sliceutils"
|
||||
"strings"
|
||||
|
||||
"github.com/lmika/awstools/internal/dynamo-browse/models"
|
||||
|
|
@ -114,6 +115,36 @@ func (s *Service) PutItemAt(ctx context.Context, resultSet *models.ResultSet, in
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *Service) PutSelectedItems(ctx context.Context, resultSet *models.ResultSet, shouldPut func(idx int) bool) (int, error) {
|
||||
type dirtyItem struct {
|
||||
item models.Item
|
||||
idx int
|
||||
}
|
||||
|
||||
dirtyItems := make([]dirtyItem, 0)
|
||||
for i, item := range resultSet.Items() {
|
||||
if shouldPut(i) {
|
||||
dirtyItems = append(dirtyItems, dirtyItem{item, i})
|
||||
}
|
||||
}
|
||||
|
||||
if len(dirtyItems) == 0 {
|
||||
return 0, nil
|
||||
}
|
||||
|
||||
if err := s.provider.PutItems(ctx, resultSet.TableInfo.Name, sliceutils.Map(dirtyItems, func(t dirtyItem) models.Item {
|
||||
return t.item
|
||||
})); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
|
||||
for _, di := range dirtyItems {
|
||||
resultSet.SetDirty(di.idx, false)
|
||||
resultSet.SetNew(di.idx, false)
|
||||
}
|
||||
return len(dirtyItems), nil
|
||||
}
|
||||
|
||||
func (s *Service) Delete(ctx context.Context, tableInfo *models.TableInfo, items []models.Item) error {
|
||||
for _, item := range items {
|
||||
if err := s.provider.DeleteItem(ctx, tableInfo.Name, item.KeyValue(tableInfo)); err != nil {
|
||||
|
|
|
|||
|
|
@ -13,8 +13,7 @@ import (
|
|||
func TestService_Describe(t *testing.T) {
|
||||
tableName := "service-test-data"
|
||||
|
||||
client, cleanupFn := testdynamo.SetupTestTable(t, testData)
|
||||
defer cleanupFn()
|
||||
client := testdynamo.SetupTestTable(t, testData)
|
||||
provider := dynamo.NewProvider(client)
|
||||
|
||||
t.Run("return details of the table", func(t *testing.T) {
|
||||
|
|
@ -35,8 +34,7 @@ func TestService_Describe(t *testing.T) {
|
|||
func TestService_Scan(t *testing.T) {
|
||||
tableName := "service-test-data"
|
||||
|
||||
client, cleanupFn := testdynamo.SetupTestTable(t, testData)
|
||||
defer cleanupFn()
|
||||
client := testdynamo.SetupTestTable(t, testData)
|
||||
provider := dynamo.NewProvider(client)
|
||||
|
||||
t.Run("return all columns and fields in sorted order", func(t *testing.T) {
|
||||
|
|
@ -52,9 +50,6 @@ func TestService_Scan(t *testing.T) {
|
|||
// 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"})
|
||||
//assert.Equal(t, rs.Items[0], testdynamo.TestRecordAsItem(t, testData[1]))
|
||||
//assert.Equal(t, rs.Items[1], testdynamo.TestRecordAsItem(t, testData[0]))
|
||||
//assert.Equal(t, rs.Items[2], testdynamo.TestRecordAsItem(t, testData[2]))
|
||||
})
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue