AS.der.hs revision e9458b1a7a19a63aa4c179f9ab20f4d50681c168
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski{-# LANGUAGE DeriveDataTypeable #-}
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner{- |
e1f395fef7ea8b00a675a330e5461fad35158ca5Christian MaederModule : ./RelationalScheme/AS.der.hs
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill MossakowskiDescription : abstract syntax for Relational Schemes
1ac0c4de66a297fd7e345d9275f723fd83bb7bd1Christian MaederCopyright : Dominik Luecke, Uni Bremen 2008
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt or LIZENZ.txt
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski
3f69b6948966979163bdfe8331c38833d5d90ecdChristian MaederMaintainer : luecke@informatik.uni-bremen.de
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill MossakowskiStability : provisional
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill MossakowskiPortability : portable
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski
f3a94a197960e548ecd6520bb768cb0d547457bbChristian MaederAbstract syntax for Relational Schemes
87b7a494f805b2b2f3311564f3dfcc4352f803fcTill Mossakowski-}
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maedermodule RelationalScheme.AS
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder ( RSRelType (..)
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder , RSQualId (..)
1f084d62dbf8ae72357697c226cacd1973f0c03fTill Mossakowski , RSRel (..)
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski , RSRelationships (..)
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder , RSScheme (..)
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder , Sentence
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder , map_rel
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder , getRels
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder , getSignature
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder ) where
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowskiimport Data.Data
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowskiimport qualified Data.Map as Map
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski
1ac0c4de66a297fd7e345d9275f723fd83bb7bd1Christian Maederimport Common.Id
b6a54d7292d7a3713000847334de4316d105f40fChristian Maederimport Common.AS_Annotation
c97ea41501cc68e04648fbed17812eee014a89a0Christian Maederimport Common.Doc
e79472ac9f45b44b205357ff33965c36bfe6f765Christian Maederimport Common.DocUtils
a7dc6e2f1ca4f1b9164b496af09228b44c8dd4b0Christian Maederimport Common.Result
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowskiimport RelationalScheme.Keywords
c438c79d00fc438f99627e612498744bdc0d0c89Christian Maederimport RelationalScheme.Sign
fa941cafef82113297227345cbb21e523f962cbePaolo Torrini
92303a4d15dffd2c571d32311dcae866bd449d86Klaus Luettich
b161fda9df774b071a907cc9b18f0e7aee244129cmaeder-- DrIFT command
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder{-! global: GetRange !-}
ad270004874ce1d0697fb30d7309f180553bb315Christian Maeder
ad270004874ce1d0697fb30d7309f180553bb315Christian Maederdata RSRelType = RSone_to_one | RSone_to_many | RSmany_to_one | RSmany_to_many
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski deriving (Eq, Ord, Typeable, Data)
c97ea41501cc68e04648fbed17812eee014a89a0Christian Maeder
b161fda9df774b071a907cc9b18f0e7aee244129cmaeder-- first Id is TableId, second is columnId
b161fda9df774b071a907cc9b18f0e7aee244129cmaederdata RSQualId = RSQualId
b161fda9df774b071a907cc9b18f0e7aee244129cmaeder {
b161fda9df774b071a907cc9b18f0e7aee244129cmaeder table :: Id
b161fda9df774b071a907cc9b18f0e7aee244129cmaeder , column :: Id
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder , q_pos :: Range
9f84560989b06003d74d125ed8b8ca99a94bd165Christian Maeder }
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder deriving (Eq, Ord, Show, Typeable, Data)
74fc328292d911eff0baa47a247005cf33d2bdd2Sonja Gröning
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maederdata RSRel = RSRel
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder {
0db76fa4de562d31f829d0113500e70771f0852dcmaeder r_lhs :: [RSQualId]
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski , r_rhs :: [RSQualId]
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder , r_type :: RSRelType
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder , r_pos :: Range
840ad39a5a571d5170e7bc4796058208502fa73fSonja Gröning }
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder deriving (Eq, Ord, Show, Typeable, Data)
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaederdata RSRelationships = RSRelationships [Annoted RSRel] Range
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder deriving (Eq, Ord, Show, Typeable, Data)
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaederdata RSScheme = RSScheme RSTables RSRelationships Range
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder deriving (Eq, Ord, Show, Typeable, Data)
2857cf346f2387af92b04a43c41e829c00664ed1cmaeder
2857cf346f2387af92b04a43c41e829c00664ed1cmaedertype Sentence = RSRel
2857cf346f2387af92b04a43c41e829c00664ed1cmaeder
3a6decfd748f532d5cb03fbcb7a42fa37b0faab3Christian Maeder-- Pretty printing stuff
3a6decfd748f532d5cb03fbcb7a42fa37b0faab3Christian Maeder
f04d7c1dac7b1dc835e63c671027455f8db17837Christian Maederinstance Pretty RSScheme where
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder pretty (RSScheme t r _) = pretty t $++$ pretty r
9b557297a9b3b1f44044b8d80a00264715b9f9d6cmaeder
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaederinstance Pretty RSRelationships where
aa0ef8adb2833838c1954e6f93c61d85d2cb226aTill Mossakowski pretty (RSRelationships rs _) = if null rs then empty else
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder keyword rsRelationships $+$ vcat (map pretty rs)
9b557297a9b3b1f44044b8d80a00264715b9f9d6cmaeder
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaederinstance Pretty RSRel where
d9b1a9c8fce2e68aaf4a8b415ab40ab461a1b488cmaeder pretty (RSRel i1 i2 tp _) =
cd6e5706893519bfcf24539afa252fcbed5097ddKlaus Luettich let tbl is = case is of
e24ad3f655daa60ddabe690e4b11de3187996c16cmaeder [] -> empty
e24ad3f655daa60ddabe690e4b11de3187996c16cmaeder t : _ -> pretty (table t)
90fbaf1cd73486129e26e1ac94a413550832e4d6Thiemo Wiedemeyer <> brackets (ppWithCommas is)
90fbaf1cd73486129e26e1ac94a413550832e4d6Thiemo Wiedemeyer in fsep [tbl i1, funArrow, tbl i2, keyword (show tp)]
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maederinstance Pretty RSQualId where
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder pretty = pretty . column
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maederinstance Show RSRelType where
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder show r = case r of
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder RSone_to_one -> rs1to1
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder RSone_to_many -> rs1tom
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder RSmany_to_one -> rsmto1
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder RSmany_to_many -> rsmtom
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maedermap_qualId :: RSMorphism -> RSQualId -> Result RSQualId
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maedermap_qualId mor qid =
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder let
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder (tid, rid, rn) = case qid of
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder RSQualId i1 i2 rn1 -> (i1, i2, rn1)
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder in maybe (fail "map_qualId") return $ do
eb9c04f9cff47a81f6d362ca03fbf4cb7ab97e7ccmaeder mtid <- Map.lookup tid $ table_map mor
f094a7999dfa79cad2eb34ce15f1939c0d6b9e39Till Mossakowski rmor <- Map.lookup tid $ column_map mor
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder mrid <- Map.lookup rid $ col_map rmor
c44c23429c72f3a709e22a18f2ed6f05fc8cc765Christian Maeder return $ RSQualId mtid mrid rn
1d3635d5ca4cfbe47c3f1add3790f68b6c76c57dChristian Maeder
f094a7999dfa79cad2eb34ce15f1939c0d6b9e39Till Mossakowski
f094a7999dfa79cad2eb34ce15f1939c0d6b9e39Till Mossakowskimap_rel :: RSMorphism -> RSRel -> Result RSRel
2eb18519bf2f61e04ffbe68ab06ec1e32eee07d7Christian Maedermap_rel mor rel =
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder let
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian Maeder (q1, q2, rt, rn) = case rel of
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder RSRel qe1 qe2 rte rne -> (qe1, qe2, rte, rne)
b6a54d7292d7a3713000847334de4316d105f40fChristian Maeder in
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder do
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder mq1 <- mapM (map_qualId mor) q1
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder mq2 <- mapM (map_qualId mor) q2
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder return $ RSRel mq1 mq2 rt rn
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder
b205bc86685958085af2b816c277faef3ebed52aChristian Maeder{-
135bcb7f65991146c103e5e7599adbc49fe7359dChristian Maedermap_arel :: RSMorphism -> (Annoted RSRel) -> Result (Annoted RSRel)
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maedermap_arel mor arel =
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder let
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder rel = item arel
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder (q1, q2, rt, rn) = case rel of
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder RSRel qe1 qe2 rte rne -> (qe1, qe2, rte, rne)
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder in
4ef05f4edeb290beb89845f57156baa5298af7c4Christian Maeder do
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder mq1 <- mapM (map_qualId mor) q1
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder mq2 <- mapM (map_qualId mor) q2
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder return $ arel
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder {
b6a54d7292d7a3713000847334de4316d105f40fChristian Maeder item = RSRel mq1 mq2 rt rn
3a6decfd748f532d5cb03fbcb7a42fa37b0faab3Christian Maeder }
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maedermap_relships :: RSMorphism -> RSRelationships -> Result RSRelationships
b6a54d7292d7a3713000847334de4316d105f40fChristian Maedermap_relships mor rsh =
0a64bfd28dff15bc93e1f7a86e0a8052e879636dChristian Maeder let
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder (arel, rn) = case rsh of
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder RSRelationships arel1 rn1 -> (arel1, rn1)
3fe4d4988c6d17ce5df9b413af03944114dc5d63Christian Maeder in
3fe4d4988c6d17ce5df9b413af03944114dc5d63Christian Maeder do
3fe4d4988c6d17ce5df9b413af03944114dc5d63Christian Maeder orel <- mapM (map_arel mor) arel
3a6decfd748f532d5cb03fbcb7a42fa37b0faab3Christian Maeder return $ RSRelationships orel rn
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder-}
ef7cdc5bb04f4c0d1a14cbd3008959edd2d6336cChristian Maeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder-- ^ oo-style getter function for Relations
80c2d23821d095b55d9a547f48fc3fcdc27df405Christian MaedergetRels :: RSScheme -> [Annoted RSRel]
b6a54d7292d7a3713000847334de4316d105f40fChristian MaedergetRels spec = case spec of
b418a0262aa84ea68de72623793361bebed51f9eChristian Maeder RSScheme _ (RSRelationships rels _) _ -> rels
b418a0262aa84ea68de72623793361bebed51f9eChristian Maeder
177b47384142a17a086bf08966097e9c624d7891Christian Maeder-- ^ oo-style getter function for signatures
177b47384142a17a086bf08966097e9c624d7891Christian MaedergetSignature :: RSScheme -> RSTables
177b47384142a17a086bf08966097e9c624d7891Christian MaedergetSignature spec = case spec of
177b47384142a17a086bf08966097e9c624d7891Christian Maeder RSScheme tb _ _ -> tb
16076938607b9401efc432359077252dd0ed0d63Christian Maeder