-
Notifications
You must be signed in to change notification settings - Fork 50
/
capacity.go
137 lines (112 loc) · 2.47 KB
/
capacity.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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package ddb
import (
"github.com/aws/aws-sdk-go-v2/service/dynamodb/types"
"github.com/justtrackio/gosoline/pkg/mdl"
)
type capacityKind int
const (
kindRead capacityKind = iota
kindWrite
kindMixed
)
type Capacity struct {
kind capacityKind
total *float64
read *float64
write *float64
}
func newCapacity(kind capacityKind) *Capacity {
return &Capacity{
kind: kind,
}
}
func (c *Capacity) Total() float64 {
if c.total != nil {
return *c.total
}
return mdl.EmptyIfNil(c.read) + mdl.EmptyIfNil(c.write)
}
func (c *Capacity) Read() float64 {
if c.read == nil {
switch c.kind {
case kindRead:
return c.Total()
case kindWrite:
return 0.0
}
}
return mdl.EmptyIfNil(c.read)
}
func (c *Capacity) Write() float64 {
if c.write == nil {
switch c.kind {
case kindWrite:
return c.Total()
case kindRead:
return 0.0
}
}
return mdl.EmptyIfNil(c.write)
}
func (c *Capacity) add(cc *types.Capacity) {
if cc == nil {
return
}
c.addCapacity(mdl.EmptyIfNil(cc.CapacityUnits), mdl.EmptyIfNil(cc.ReadCapacityUnits), mdl.EmptyIfNil(cc.WriteCapacityUnits))
}
func (c *Capacity) addCapacity(total float64, read float64, write float64) {
addSomeCapacity := func(field **float64, value float64) {
if value != 0 {
if *field == nil {
*field = mdl.Box(value)
} else {
**field += value
}
}
}
addSomeCapacity(&c.total, total)
addSomeCapacity(&c.read, read)
addSomeCapacity(&c.write, write)
}
type ConsumedCapacity struct {
Capacity
Table Capacity
LSI map[string]*Capacity
GSI map[string]*Capacity
}
func newConsumedCapacity(kind capacityKind) *ConsumedCapacity {
return &ConsumedCapacity{
Capacity: *newCapacity(kind),
Table: *newCapacity(kind),
GSI: make(map[string]*Capacity),
LSI: make(map[string]*Capacity),
}
}
func (c *ConsumedCapacity) add(cc *types.ConsumedCapacity) {
if cc == nil {
return
}
c.Capacity.add(&types.Capacity{
CapacityUnits: cc.CapacityUnits,
ReadCapacityUnits: cc.ReadCapacityUnits,
WriteCapacityUnits: cc.WriteCapacityUnits,
})
c.Table.add(cc.Table)
for name, lsi := range cc.LocalSecondaryIndexes {
if _, ok := c.LSI[name]; !ok {
c.LSI[name] = newCapacity(c.kind)
}
c.LSI[name].add(&lsi)
}
for name, gsi := range cc.GlobalSecondaryIndexes {
if _, ok := c.GSI[name]; !ok {
c.GSI[name] = newCapacity(c.kind)
}
c.GSI[name].add(&gsi)
}
}
func (c *ConsumedCapacity) addSlice(capacities []types.ConsumedCapacity) {
for _, cc := range capacities {
c.add(&cc)
}
}