packages feed

DSH-0.8.2.1: examples/Example02.hs

{-# LANGUAGE MonadComprehensions #-}
{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE RebindableSyntax    #-}
{-# LANGUAGE ViewPatterns        #-}

module Main where

import qualified Prelude as P
import Database.DSH
import Database.DSH.Compiler

import Database.HDBC.PostgreSQL

employees :: Q [(Text, Text, Integer)]
employees = toQ [ ("Simon",  "MS",   80)
							  , ("Erik",   "MS",   90)
							  , ("Phil",   "Ed",   40)
							  , ("Gordon", "Ed",   45)
							  , ("Paul",   "Yale", 60)
							  ]

departments :: Q [Text]
departments = nub [ dept | (view -> (_name,dept,_salary)) <- employees]

deptSalary :: Q Text -> Q Integer
deptSalary dept = sum [ salary
                      | (view -> (_name,dept',salary)) <- employees
                      , dept == dept']

mainQuery :: Q [(Text,Integer)]
mainQuery = [ pair dept (deptSalary dept)
            | dept <- departments]

getConn :: IO Connection
getConn = connectPostgreSQL "user = 'giorgidz' password = '' host = 'localhost' dbname = 'giorgidz'"

runQ :: (Show a,QA a) => Q a -> IO ()
runQ q = getConn P.>>= \conn -> (fromQ conn q P.>>= P.print) P.>> disconnect conn

main :: IO ()
main = runQ mainQuery