module ProjectM36.RegisteredQuery where import ProjectM36.Base import ProjectM36.Attribute import ProjectM36.Error import ProjectM36.IsomorphicSchema import ProjectM36.Relation import qualified Data.Map as M registeredQueriesAsRelationInSchema :: Schema -> RegisteredQueries -> Either RelationalError Relation registeredQueriesAsRelationInSchema :: Schema -> RegisteredQueries -> Either RelationalError Relation registeredQueriesAsRelationInSchema Schema schema RegisteredQueries regQs = do [[Atom]] tups <- forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) mapM (Text, RelationalExpr) -> Either RelationalError [Atom] regQToTuple (forall k a. Map k a -> [(k, a)] M.toList RegisteredQueries regQs) Attributes -> [[Atom]] -> Either RelationalError Relation mkRelationFromList Attributes attrs [[Atom]] tups where attrs :: Attributes attrs = [Attribute] -> Attributes attributesFromList [Text -> AtomType -> Attribute Attribute Text "name" AtomType TextAtomType, Text -> AtomType -> Attribute Attribute Text "expr" AtomType RelationalExprAtomType] regQToTuple :: (Text, RelationalExpr) -> Either RelationalError [Atom] regQToTuple (Text qname, RelationalExpr qexpr) = do RelationalExpr qexpr' <- Schema -> RelationalExpr -> Either RelationalError RelationalExpr processRelationalExprInSchema Schema schema RelationalExpr qexpr forall (f :: * -> *) a. Applicative f => a -> f a pure [Text -> Atom TextAtom Text qname, RelationalExpr -> Atom RelationalExprAtom RelationalExpr qexpr']