module DatabaseDesign.Ampersand.Classes.ConceptStructure (ConceptStructure(..)
)
where
import DatabaseDesign.Ampersand.Core.AbstractSyntaxTree
import DatabaseDesign.Ampersand.Basics
import Data.List
import Data.Maybe
import DatabaseDesign.Ampersand.ADL1.Expression
import Prelude hiding (Ordering(..))
fatal :: Int -> String -> a
fatal = fatalMsg "Classes.ConceptStructure"
class ConceptStructure a where
concs :: a -> [A_Concept]
declsUsedIn :: a -> [Declaration]
declsUsedIn a = [ d | EDcD d@Sgn{}<-(nub.concatMap primitives.expressionsIn) a]
relsUsedIn :: a -> [Declaration]
relsUsedIn a = [ prim2dcl e | e<-nub ((concatMap primitives.expressionsIn) a++(map EDcI . concs) a), not (isMp1 e) ]
where prim2dcl expr =
case expr of
EDcD d@Sgn{} -> d
EDcD{} -> fatal 23 "invalid declaration in EDcD{}"
EDcI c -> Isn c
EDcV sgn -> Vs sgn
EMp1{} -> fatal 25 "EMp1 should be filtered out from primitives. use `filter (not isMp1)`"
_ -> fatal 26 "prim2dcl is not supposed to be called on a non-primitive expression."
expressionsIn :: a -> [Expression]
mp1Exprs :: a -> [Expression]
mp1Exprs = filter isMp1.nub.concatMap primitives.expressionsIn
instance (ConceptStructure a,ConceptStructure b) => ConceptStructure (a, b) where
concs (a,b) = concs a `uni` concs b
expressionsIn (a,b) = expressionsIn a `uni` expressionsIn b
instance ConceptStructure a => ConceptStructure (Maybe a) where
concs ma = maybe [] concs ma
expressionsIn ma = maybe [] expressionsIn ma
instance ConceptStructure a => ConceptStructure [a] where
concs = nub . concatMap concs
expressionsIn = foldr ((uni) . expressionsIn) []
instance ConceptStructure A_Context where
concs c = concs ( ctxds c ++ concatMap ptdcs (ctxpats c) ++ concatMap prcDcls (ctxprocs c) )
`uni` concs ( ctxgs c ++ concatMap ptgns (ctxpats c) ++ concatMap prcGens (ctxprocs c) )
`uni` [ONE]
expressionsIn c = foldr (uni) []
[ (expressionsIn.ctxpats) c
, (expressionsIn.ctxprocs) c
, (expressionsIn.ctxifcs) c
, (expressionsIn.ctxrs) c
, (expressionsIn.ctxks) c
, (expressionsIn.ctxvs) c
, (expressionsIn.ctxsql) c
, (expressionsIn.ctxphp) c
]
instance ConceptStructure IdentityDef where
concs identity = [idCpt identity] `uni` concs [objDef | IdentityExp objDef <- identityAts identity]
expressionsIn identity = expressionsIn [objDef | IdentityExp objDef <- identityAts identity]
instance ConceptStructure ViewDef where
concs vd = [vdcpt vd] `uni` concs [objDef | ViewExp objDef <- vdats vd]
expressionsIn vd = expressionsIn [objDef | ViewExp objDef <- vdats vd]
instance ConceptStructure Expression where
concs (EDcI c ) = [c]
concs (EEps i sgn) = nub (i:concs sgn)
concs (EDcV sgn) = concs sgn
concs (EMp1 _ c ) = [c]
concs e = foldrMapExpression uni concs [] e
expressionsIn e = [e]
instance ConceptStructure A_Concept where
concs c = [c]
expressionsIn _ = []
instance ConceptStructure Sign where
concs (Sign s t) = nub [s,t]
expressionsIn _ = []
instance ConceptStructure ObjectDef where
concs obj = [target (objctx obj)] `uni` concs (objmsub obj)
expressionsIn obj = foldr (uni) []
[ (expressionsIn.objctx) obj
, (expressionsIn.objmsub) obj
]
instance ConceptStructure SubInterface where
concs (Box _ objs) = concs objs
concs (InterfaceRef _) = []
expressionsIn (Box _ objs) = expressionsIn objs
expressionsIn (InterfaceRef _) = []
instance ConceptStructure Pattern where
concs p = concs (ptgns p) `uni` concs (ptdcs p) `uni` concs (ptrls p) `uni` concs (ptids p)
expressionsIn p = foldr (uni) []
[ (expressionsIn.ptrls) p
, (expressionsIn.ptids) p
, (expressionsIn.ptvds) p
]
instance ConceptStructure Process where
concs p = concs (prcGens p) `uni` concs (prcDcls p) `uni` concs (prcRules p) `uni` concs (prcIds p)
expressionsIn p = foldr (uni) []
[ (expressionsIn.prcRules) p
, (expressionsIn.prcIds) p
, (expressionsIn.prcVds) p
]
instance ConceptStructure Interface where
concs ifc = concs (ifcObj ifc)
expressionsIn ifc = foldr (uni) []
[ (expressionsIn.ifcObj) ifc
, (expressionsIn.ifcParams) ifc
]
instance ConceptStructure Declaration where
concs d = concs (sign d)
expressionsIn _ = fatal 148 "expressionsIn not allowed on Declaration"
instance ConceptStructure Rule where
concs r = concs (rrexp r) ++ concs (rrviol r)
expressionsIn r = foldr (uni) []
[ (expressionsIn.rrexp ) r
, (expressionsIn.rrviol) r
]
instance ConceptStructure (PairView Expression) where
concs (PairView ps) = concs ps
expressionsIn (PairView ps) = expressionsIn ps
instance ConceptStructure (PairViewSegment Expression) where
concs (PairViewText _) = []
concs (PairViewExp _ x) = concs x
expressionsIn (PairViewText _) = []
expressionsIn (PairViewExp _ x) = expressionsIn x
instance ConceptStructure A_Gen where
concs g@Isa{} = nub [gengen g,genspc g]
concs g@IsE{} = nub (genspc g: genrhs g)
expressionsIn _ = fatal 160 "expressionsIn not allowed on A_Gen"