on fb3e778 help sign in
33 lines 1.3 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module ProjectM36.Key where
3import ProjectM36.Base
4import ProjectM36.Relation
5import qualified Data.Set as S
7{-
8keys can be implemented using inclusion dependencies as well: the count of the projection of the keys' attributes must be equal to the count of the tuples- p. 120 Database in Depth
10example:
11:showexpr ((relation{tuple{}}:{a:=S}):{b:=count(@a)}){b}
12┌─┐
13│b│
14├─┤
15│5│
16└─┘
17((relation{tuple{}}:{a:=S{S#}}):{b:=count(@a)}){b}
18┌─┐
19│b│
20├─┤
21│5│
22└─┘
23-}
24inclusionDependencyForKey :: AttributeNames -> RelationalExpr -> InclusionDependency
25inclusionDependencyForKey attrNames relExpr = --InclusionDependency name (exprCount relExpr) (exprCount (projectedOnKeys relExpr))
26 InclusionDependency equalityExpr (ExistingRelation relationFalse)
27 where
28 projectedOnKeys expr = Project attrNames expr
29 exprAsSubRelation expr = Extend (AttributeTupleExpr "a" (RelationAtomExpr expr)) (ExistingRelation relationTrue)
30 exprCount expr = projectionForCount (Extend (AttributeTupleExpr "b" (FunctionAtomExpr "count" [AttributeAtomExpr "a"])) (exprAsSubRelation expr))
31 projectionForCount expr = Project (AttributeNames $ S.fromList ["b"]) expr
32 equalityExpr = NotEquals (exprCount relExpr) (exprCount (projectedOnKeys relExpr))