module Model.AssetSlot.SQL
( slotAssetRow
, makeSlotAsset
, selectContainerSlotAsset
, selectAssetSlotAsset
, selectVolumeSlotAsset
, selectVolumeSlotIdAsset
, selectAssetSlot
) where
import Data.Maybe (fromMaybe)
import qualified Language.Haskell.TH as TH
import Has (view)
import Model.Segment
import Model.Volume.Types
import Model.Asset.Types
import Model.Asset.SQL
import Model.Container.Types
import Model.Container.SQL
import Model.Slot.Types
import Model.SQL.Select
import Model.Volume.SQL
import Model.AssetSlot.Types
slotAssetRow :: Selector
slotAssetRow = selectColumn "slot_asset" "segment"
makeSlotAsset :: Asset -> Container -> Segment -> AssetSlot
makeSlotAsset a c s = AssetSlot a (Just (Slot c s))
_selectAssetContainerSlotAsset :: Selector
_selectAssetContainerSlotAsset = selectMap (TH.VarE 'makeSlotAsset `TH.AppE`) slotAssetRow
makeContainerSlotAsset :: Segment -> AssetRow -> Container -> AssetSlot
makeContainerSlotAsset s ar c = makeSlotAsset (Asset ar $ view c) c s
selectContainerSlotAsset :: Selector
selectContainerSlotAsset = selectJoin 'makeContainerSlotAsset
[ slotAssetRow
, joinOn "slot_asset.asset = asset.id" selectAssetRow
]
makeVolumeSlotIdAsset :: SlotId -> AssetRow -> Volume -> (Asset, SlotId)
makeVolumeSlotIdAsset s ar v = (Asset ar v, s)
selectVolumeSlotIdAsset :: Selector
selectVolumeSlotIdAsset = selectJoin 'makeVolumeSlotIdAsset
[ selectColumns 'SlotId "slot_asset" ["container", "segment"]
, joinOn "slot_asset.asset = asset.id"
selectAssetRow
]
makeAssetSlotAsset :: Segment -> (Volume -> Container) -> Asset -> AssetSlot
makeAssetSlotAsset s cf a = makeSlotAsset a (cf (view a)) s
selectAssetSlotAsset :: Selector
selectAssetSlotAsset = selectJoin 'makeAssetSlotAsset
[ slotAssetRow
, joinOn "slot_asset.container = container.id"
selectVolumeContainer
]
makeVolumeSlotAsset :: Segment -> AssetRow -> (Volume -> Container) -> Volume -> AssetSlot
makeVolumeSlotAsset s ar cf v = makeSlotAsset (Asset ar v) (cf v) s
selectVolumeSlotAsset :: Selector
selectVolumeSlotAsset = selectJoin 'makeVolumeSlotAsset
[ slotAssetRow
, joinOn "slot_asset.asset = asset.id"
selectAssetRow
, joinOn "slot_asset.container = container.id AND asset.volume = container.volume"
selectVolumeContainer
]
makeVolumeAssetSlot :: AssetRow -> Maybe (Asset -> AssetSlot) -> Volume -> AssetSlot
makeVolumeAssetSlot ar sf = fromMaybe assetNoSlot sf . Asset ar
selectVolumeAssetSlot :: Selector
selectVolumeAssetSlot = selectJoin 'makeVolumeAssetSlot
[ selectAssetRow
, maybeJoinOn "asset.id = slot_asset.asset AND asset.volume = container.volume"
selectAssetSlotAsset
]
selectAssetSlot :: TH.Name
-> Selector
selectAssetSlot ident = selectJoin '($)
[ selectVolumeAssetSlot
, joinOn "asset.volume = volume.id"
$ selectVolume ident
]