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
|
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
-----------------------------------------------------------------------------
-- |
-- Module : Aws.DynamoDb.Commands.BatchWriteItem
-- Copyright : Soostone Inc
-- License : BSD3
--
-- Maintainer : Justin Dawson <jtdawso@gmail.com>
-- Stability : experimental
--
-- @http:\/\/docs.aws.amazon.com\/amazondynamodb\/latest\/APIReference\/API_BatchWriteItem.html@
----------------------------------------------------------------------------
module Aws.DynamoDb.Commands.BatchWriteItem where
-------------------------------------------------------------------------------
import Control.Applicative
import Data.Aeson
import Data.Default
import Data.Foldable (asum)
import qualified Data.HashMap.Strict as HM
import qualified Data.Text as T
import Prelude
-------------------------------------------------------------------------------
import Aws.Core
import Aws.DynamoDb.Core
import Aws.DynamoDb.Commands.PutItem
import Aws.DynamoDb.Commands.DeleteItem
-------------------------------------------------------------------------------
data Request = PutRequest { prItem :: Item }
| DeleteRequest {drKey :: PrimaryKey}
deriving (Eq,Show,Read,Ord)
data BatchWriteItem = BatchWriteItem {
bwRequests :: [(T.Text,[Request])]
-- ^ Put or Delete Requests for a specified table
, bwRetCons :: ReturnConsumption
, bwRetMet :: ReturnItemCollectionMetrics
} deriving (Eq,Show,Read,Ord)
-------------------------------------------------------------------------------
toBatchWrite :: [PutItem]
-> [DeleteItem]
-> BatchWriteItem
toBatchWrite ps ds =BatchWriteItem maps def def
where
maps :: [(T.Text,[Request])]
maps = let pMap = foldl (\acc p -> let key = piTable p
in HM.insert key (PutRequest (piItem p) : (HM.lookupDefault [] key acc)) acc) HM.empty ps
totalMap = foldl (\acc d -> let key = diTable d
in HM.insert key (DeleteRequest (diKey d) : (HM.lookupDefault [] key acc)) acc) pMap ds
in HM.toList totalMap
-- | Construct a BatchWriteItem
batchWriteItem :: [(T.Text,[Request])]
-> BatchWriteItem
batchWriteItem reqs = BatchWriteItem reqs def def
instance ToJSON Request where
toJSON PutRequest{..} =
object $
[ "PutRequest" .= (object $ ["Item" .= prItem])
]
toJSON DeleteRequest{..} =
object $
[ "DeleteRequest" .= (object $ ["Key" .= drKey])
]
instance ToJSON BatchWriteItem where
toJSON BatchWriteItem{..} =
object $
[ "RequestItems" .= HM.fromList bwRequests
, "ReturnConsumedCapacity" .= bwRetCons
, "ReturnItemCollectionMetrics" .= bwRetMet
]
instance FromJSON Request where
parseJSON = withObject "PutRequest or DeleteRequest" $ \o ->
asum [
do
pr <- o .: "PutRequest"
i <- pr .: "Item"
return $ PutRequest i ,
do
dr <- o .: "DeleteRequest"
pk <- dr .: "Key"
return $ DeleteRequest pk
]
data BatchWriteItemResponse = BatchWriteItemResponse {
bwUnprocessed :: [(T.Text,[Request])]
-- ^ Unprocessed Requests on failure
, bwConsumed :: Maybe ConsumedCapacity
-- ^ Amount of capacity consumed
, bwColMet :: Maybe ItemCollectionMetrics
-- ^ Collection metrics for tables affected by BatchWriteItem.
} deriving (Eq,Show,Read,Ord)
instance Transaction BatchWriteItem BatchWriteItemResponse
instance SignQuery BatchWriteItem where
type ServiceConfiguration BatchWriteItem = DdbConfiguration
signQuery gi = ddbSignQuery "BatchWriteItem" gi
instance FromJSON BatchWriteItemResponse where
parseJSON (Object v) = BatchWriteItemResponse
<$> HM.toList <$> (v .: "UnprocessedItems")
<*> v .:? "ConsumedCapacity"
<*> v .:? "ItemCollectionMetrics"
parseJSON _ = fail "BatchWriteItemResponse must be an object."
instance ResponseConsumer r BatchWriteItemResponse where
type ResponseMetadata BatchWriteItemResponse = DdbResponse
responseConsumer _ _ ref resp = ddbResponseConsumer ref resp
instance AsMemoryResponse BatchWriteItemResponse where
type MemoryResponse BatchWriteItemResponse = BatchWriteItemResponse
loadToMemory = return
|