/
opGet.go
89 lines (74 loc) · 1.98 KB
/
opGet.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
//
// Copyright (C) 2022 Dmitry Kolesnikov
//
// This file may be modified and distributed under the terms
// of the MIT license. See the LICENSE file for details.
// https://github.com/fogfish/dynamo
//
package ddb
import (
"context"
"github.com/aws/aws-sdk-go-v2/service/dynamodb"
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
)
// Get item from storage
func (db *Storage[T]) Get(ctx context.Context, key T) (T, error) {
gen, err := db.codec.EncodeKey(key)
if err != nil {
return db.undefined, errInvalidKey.New(err)
}
req := &dynamodb.GetItemInput{
Key: gen,
TableName: db.table,
ProjectionExpression: db.schema.Projection,
ExpressionAttributeNames: db.schema.ExpectedAttributeNames,
}
val, err := db.service.GetItem(ctx, req)
if err != nil {
return db.undefined, errServiceIO.New(err)
}
if val.Item == nil {
return db.undefined, errNotFound(nil, key)
}
obj, err := db.codec.Decode(val.Item)
if err != nil {
return db.undefined, errInvalidEntity.New(err)
}
return obj, nil
}
func (db *Storage[T]) BatchGet(ctx context.Context, keys []T) ([]T, error) {
seq := make([]map[string]types.AttributeValue, len(keys))
for i := 0; i < len(keys); i++ {
gen, err := db.codec.EncodeKey(keys[i])
if err != nil {
return nil, errInvalidKey.New(err)
}
seq[i] = gen
}
req := &dynamodb.BatchGetItemInput{
RequestItems: map[string]types.KeysAndAttributes{
*db.table: {
Keys: seq,
ProjectionExpression: db.schema.Projection,
ExpressionAttributeNames: db.schema.ExpectedAttributeNames,
},
},
}
val, err := db.service.BatchGetItem(ctx, req)
if err != nil {
return nil, errServiceIO.New(err)
}
rsp, exists := val.Responses[*db.table]
if !exists {
return make([]T, 0), nil
}
items := make([]T, len(rsp))
for i := 0; i < len(rsp); i++ {
obj, err := db.codec.Decode(rsp[i])
if err != nil {
return nil, errInvalidEntity.New(err)
}
items[i] = obj
}
return items, nil
}