dsh-sql-0.2.0.0: src/Database/DSH/Backend/Sql/Vector.hs
{-# LANGUAGE TemplateHaskell #-}
module Database.DSH.Backend.Sql.Vector where
-- import Data.Monoid
import Data.Aeson.TH
import Database.Algebra.Dag.Common
import qualified Database.Algebra.Table.Lang as TA
import Database.DSH.Common.Vector
--------------------------------------------------------------------------------
-- | The ordering columns of a data vector
newtype VecOrder = VecOrder [TA.SortDir]
unOrd :: VecOrder -> Int
unOrd (VecOrder os) = length os
instance Monoid VecOrder where
mempty = VecOrder []
mappend (VecOrder o1) (VecOrder o2) = VecOrder (o1 ++ o2)
--------------------------------------------------------------------------------
-- | The natural key of a data vector
newtype VecKey = VecKey { unKey :: Int }
instance Monoid VecKey where
mempty = VecKey 0
mappend (VecKey k1) (VecKey k2) = VecKey (k1 + k2)
--------------------------------------------------------------------------------
-- | Outer key reference columns
newtype VecRef = VecRef { unRef :: Int }
-- | Derive inner references from an outer key.
keyRef :: VecKey -> VecRef
keyRef (VecKey i) = VecRef i
instance Monoid VecRef where
mempty = VecRef 0
mappend (VecRef r1) (VecRef r2) = VecRef (r1 + r2)
--------------------------------------------------------------------------------
-- | Payload columns of a data vector
newtype VecItems = VecItems { unItems :: Int }
instance Monoid VecItems where
mempty = VecItems 0
mappend (VecItems i1) (VecItems i2) = VecItems (i1 + i2)
--------------------------------------------------------------------------------
-- | Source columns of a transformation vector
newtype VecTransSrc = VecTransSrc { unSrc :: Int }
-- | Destination columns of a transformation vector
newtype VecTransDst = VecTransDst { unDst :: Int }
--------------------------------------------------------------------------------
-- | Key columns of a filter vector
newtype VecFilter = VecFilter Int
--------------------------------------------------------------------------------
data TADVec = TADVec AlgNode VecOrder VecKey VecRef VecItems
data TAKVec = TAKVec AlgNode VecTransSrc VecTransDst
data TARVec = TARVec AlgNode VecTransSrc VecTransDst
-- | Sorting of segments is a NOOP in the natural key backend.
data TASVec = TASVec
data TAFVec = TAFVec AlgNode VecFilter
instance DagVector TADVec where
vectorNodes (TADVec n _ _ _ _) = [n]
updateVector n1 n2 (TADVec q o k r i)
| q == n1 = TADVec n2 o k r i
| otherwise = TADVec q o k r i
--------------------------------------------------------------------------------
$(deriveJSON defaultOptions ''VecOrder)
$(deriveJSON defaultOptions ''VecKey)
$(deriveJSON defaultOptions ''VecRef)
$(deriveJSON defaultOptions ''VecItems)
$(deriveJSON defaultOptions ''VecTransSrc)
$(deriveJSON defaultOptions ''VecTransDst)
$(deriveJSON defaultOptions ''TADVec)
$(deriveJSON defaultOptions ''TAKVec)
$(deriveJSON defaultOptions ''TARVec)
--------------------------------------------------------------------------------