Modified put to put all dirty or marked items

This commit is contained in:
Leon Mika 2022-07-16 11:35:53 +10:00
parent 9fee17a6a6
commit 2dbd664dd2
13 changed files with 329 additions and 167 deletions

View file

@ -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
}

View file

@ -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 {

View file

@ -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]))
})
}