packages feed

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)

--------------------------------------------------------------------------------