packages feed

project-m36-1.0.0: src/lib/ProjectM36/InclusionDependency.hs

module ProjectM36.InclusionDependency where
import ProjectM36.Base
import ProjectM36.Attribute
import ProjectM36.Error
import ProjectM36.Relation
import qualified Data.Map as M

inclusionDependenciesAsRelation :: InclusionDependencies -> Either RelationalError Relation
inclusionDependenciesAsRelation incDeps =
  mkRelationFromList attrs (map incDepAsAtoms (M.toList incDeps))
  where
    attrs = attributesFromList [Attribute "name" TextAtomType,
                                Attribute "sub" RelationalExprAtomType,
                                Attribute "super" RelationalExprAtomType
                                ]
    incDepAsAtoms (name, InclusionDependency exprA exprB) = [TextAtom name,
                                                             RelationalExprAtom exprA,
                                                             RelationalExprAtom exprB]

-- validate that the given AtomExpr is true for an relvar
inclusionDependencyForAtomExpr :: RelVarName -> AtomExpr -> InclusionDependency
inclusionDependencyForAtomExpr rvname atomExpr =
  InclusionDependency
  (NotEquals (ExistingRelation relationTrue)
    (Project (AttributeNames mempty) (Restrict check (RelationVariable rvname ())))
  )
  (ExistingRelation relationFalse)
  where
    check = AtomExprPredicate atomExpr