module Example.RelationalAlgebra where
import Query
import Company
import qualified Data.Map as Map
import Data.Maybe (isNothing, )
import qualified Data.Tree as Tree
employees :: [Emp]
employees = emp
clerks :: [Emp]
clerks =
filter (\e -> job e == Clerk) emp
richClerks :: [Emp]
richClerks =
filter (\e -> job e == Clerk && sal e >= 1000) emp
researchers :: [Emp]
researchers =
map fst
(filter (\(e,d) -> deptno e == deptno d && dname d == "RESEARCH")
(cross emp dept))
researchers0 :: [Emp]
researchers0 =
map snd
(filter (\(d,e) -> deptno e == deptno d)
(cross (filter (\d -> dname d == "RESEARCH") dept) emp))
hierarchy :: Tree.Forest Emp
hierarchy =
let emptrees =
map (\e -> Tree.Node e (filter ((Just (empno e) ==) . mgr . Tree.rootLabel) emptrees)) emp
in filter (isNothing . mgr . Tree.rootLabel) emptrees
hierarchyFast :: Tree.Forest Emp
hierarchyFast =
let emptrees =
Map.fromListWith (++) $
map
(\e -> (mgr e, [Tree.Node e (Map.findWithDefault [] (Just (empno e)) emptrees)]))
emp
in Map.findWithDefault [] Nothing emptrees
teamSalaries :: [(String, Int)]
teamSalaries =
let recurse (Tree.Node e sub0) =
let sub1 = map recurse sub0
in Tree.Node (ename e, sal e + sum (map (snd . Tree.rootLabel) sub1)) sub1
in Tree.flatten =<< map recurse hierarchyFast