in dax/internal/client/response.go [599:743]
func decodeBatchGetItemOutput(ctx context.Context, reader *cbor.Reader, input *dynamodb.BatchGetItemInput, keySchemaCache *lru.Lru, attrNamesListToId *lru.Lru, output *dynamodb.BatchGetItemOutput) (*dynamodb.BatchGetItemOutput, error) {
if consumed, err := consumeNil(reader); err != nil {
return output, err
} else if consumed {
return output, nil
}
l, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
if l != 2 {
return output, &smithy.SerializationError{Err: fmt.Errorf("Unexpected number of objects %d in BatchGetItemOutput", l)}
}
projectionsByTable := make(map[string][]documentPath, len(input.RequestItems))
for table, kaas := range input.RequestItems {
if kaas.ProjectionExpression != nil {
dp, err := buildProjectionOrdinals(kaas.ProjectionExpression, kaas.ExpressionAttributeNames)
if err != nil {
return output, err
}
projectionsByTable[table] = dp
}
}
numTables, err := reader.ReadMapLength()
if err != nil {
return output, err
}
if output == nil {
output = &dynamodb.BatchGetItemOutput{}
}
if numTables > 0 {
output.Responses = make(map[string][]map[string]types.AttributeValue, numTables)
for i := 0; i < numTables; i++ {
table, err := reader.ReadString()
if err != nil {
return output, err
}
projections, hasProjections := projectionsByTable[table]
if hasProjections {
numItems, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
items := make([]map[string]types.AttributeValue, numItems)
for j := 0; j < numItems; j++ {
if items[j], err = decodeNonKeyAttributes(ctx, reader, attrNamesListToId, projections); err != nil {
return output, err
}
}
output.Responses[table] = items
} else {
tableKeys, err := getKeySchema(ctx, keySchemaCache, table)
if err != nil {
return output, err
}
numObjs, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
numItems := numObjs / 2
items := make([]map[string]types.AttributeValue, numItems)
for j := 0; j < numItems; j++ {
keys, err := decodeKey(reader, tableKeys)
if err != nil {
return output, err
}
item, err := decodeNonKeyAttributes(ctx, reader, attrNamesListToId, projections)
if err != nil {
return output, err
}
for k, v := range keys {
item[k] = v
}
items[j] = item
}
output.Responses[table] = items
}
}
}
numUnprocessed, err := reader.ReadMapLength()
if err != nil {
return output, err
}
if numUnprocessed > 0 {
unprocessed := make(map[string]types.KeysAndAttributes, numUnprocessed)
for i := 0; i < numUnprocessed; i++ {
table, err := reader.ReadString()
if err != nil {
return output, err
}
tableKeys, err := getKeySchema(ctx, keySchemaCache, table)
if err != nil {
return output, err
}
numKeys, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
if numKeys <= 0 {
continue
}
keys := make([]map[string]types.AttributeValue, numKeys)
for j := 0; j < numKeys; j++ {
if keys[j], err = decodeKey(reader, tableKeys); err != nil {
return output, err
}
}
outKaas := types.KeysAndAttributes{Keys: keys}
if inKaas, ok := input.RequestItems[table]; ok {
outKaas.AttributesToGet = inKaas.AttributesToGet
outKaas.ConsistentRead = inKaas.ConsistentRead
outKaas.ExpressionAttributeNames = inKaas.ExpressionAttributeNames
outKaas.Keys = keys
outKaas.ProjectionExpression = inKaas.ProjectionExpression
}
unprocessed[table] = outKaas
}
if len(unprocessed) != 0 {
output.UnprocessedKeys = unprocessed
}
}
numCC, err := reader.ReadArrayLength()
if err != nil {
return output, err
}
if numCC > 0 {
output.ConsumedCapacity = make([]types.ConsumedCapacity, numCC)
for i := 0; i < numCC; i++ {
capacity, err := decodeConsumedCapacity(reader)
if err != nil {
return output, err
}
output.ConsumedCapacity[i] = *capacity
}
}
return output, nil
}