content: module ProjectM36.FunctionalDependency where
  import ProjectM36.Base 
  import qualified Data.Set as S
  
  data FunctionalDependency = FunctionalDependency AttributeNames AttributeNames RelationalExpr
  
  --(s{city} group ({city} as x) : {z:=count(@x)}) {z}
  -- as defined in Relational Algebra and All That Jazz page 21
  inclusionDependenciesForFunctionalDependency :: FunctionalDependency -> (InclusionDependency, InclusionDependency)
  inclusionDependenciesForFunctionalDependency (FunctionalDependency attrNamesSource attrNamesDependent relExpr) = (
    InclusionDependency countSource countDep,            
    InclusionDependency countDep countSource)
    where
      countDep = relExprCount relExpr (UnionAttributeNames attrNamesSource attrNamesDependent)
      countSource = relExprCount relExpr attrNamesSource
      projectZName = Project (AttributeNames (S.singleton "z"))
      zCount = FunctionAtomExpr "count" [AttributeAtomExpr "x"] ()
      extendZName = Extend (AttributeExtendTupleExpr "z" zCount)
      relExprCount expr projectionAttrNames = projectZName (extendZName
         (Group projectionAttrNames "x" (Project projectionAttrNames expr)))
  