on ca59541 help sign in
32 lines 1.3 kB history raw
1module ProjectM36.Key where
2import ProjectM36.Base
3import ProjectM36.Relation
4import qualified Data.Set as S
6{-
7keys 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
9example:
10:showexpr ((relation{tuple{}}:{a:=S}):{b:=count(@a)}){b}
11┌─┐
12│b│
13├─┤
14│5│
15└─┘
16((relation{tuple{}}:{a:=S{S#}}):{b:=count(@a)}){b}
17┌─┐
18│b│
19├─┤
20│5│
21└─┘
22-}
23inclusionDependencyForKey :: AttributeNames -> RelationalExpr -> InclusionDependency
24inclusionDependencyForKey attrNames relExpr = --InclusionDependency name (exprCount relExpr) (exprCount (projectedOnKeys relExpr))
25 InclusionDependency equalityExpr (ExistingRelation relationFalse)
26 where
27 projectedOnKeys expr = Project attrNames expr
28 exprAsSubRelation expr = Extend (AttributeExtendTupleExpr "a" (RelationAtomExpr expr)) (ExistingRelation relationTrue)
29 exprCount expr = projectionForCount (Extend (AttributeExtendTupleExpr "b" (FunctionAtomExpr "count" [AttributeAtomExpr "a"] () )) (exprAsSubRelation expr))
30 projectionForCount expr = Project (AttributeNames $ S.fromList ["b"]) expr
31 equalityExpr = NotEquals (exprCount relExpr) (exprCount (projectedOnKeys relExpr))