{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
--really, a better name for this module could be "TransTransactionGraphRelationalExpr", but that name is too long
module ProjectM36.TransGraphRelationalExpression where
import ProjectM36.Base
import ProjectM36.TransactionGraph
import ProjectM36.Error
import qualified Data.Map as M
import Control.Monad.Trans.Reader
import Control.Monad.Trans.Class
import Control.Monad.Trans.Except
import Data.Functor.Identity

-- | The TransGraphRelationalExpression is equivalent to a relational expression except that relation variables can reference points in the transaction graph (at previous points in time).
type TransGraphRelationalExpr = RelationalExprBase TransactionIdLookup

type TransGraphAttributeNames = AttributeNamesBase TransactionIdLookup

type TransGraphExtendTupleExpr = ExtendTupleExprBase TransactionIdLookup

type TransGraphTupleExpr = TupleExprBase TransactionIdLookup

type TransGraphTupleExprs = TupleExprsBase TransactionIdLookup

type TransGraphRestrictionPredicateExpr = RestrictionPredicateExprBase TransactionIdLookup

type TransGraphAtomExpr = AtomExprBase TransactionIdLookup

type TransGraphAttributeExpr = AttributeExprBase TransactionIdLookup

type TransGraphWithNameExpr = WithNameExprBase TransactionIdLookup

newtype TransGraphEvalEnv = TransGraphEvalEnv {
  TransGraphEvalEnv -> TransactionGraph
tge_graph :: TransactionGraph
  }

type TransGraphEvalMonad a = ReaderT TransGraphEvalEnv (ExceptT RelationalError Identity) a

process :: TransGraphEvalEnv -> TransGraphRelationalExpr -> Either RelationalError GraphRefRelationalExpr
process :: TransGraphEvalEnv
-> TransGraphRelationalExpr
-> Either RelationalError GraphRefRelationalExpr
process TransGraphEvalEnv
env TransGraphRelationalExpr
texpr = Identity (Either RelationalError GraphRefRelationalExpr)
-> Either RelationalError GraphRefRelationalExpr
forall a. Identity a -> a
runIdentity (ExceptT RelationalError Identity GraphRefRelationalExpr
-> Identity (Either RelationalError GraphRefRelationalExpr)
forall e (m :: * -> *) a. ExceptT e m a -> m (Either e a)
runExceptT (ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  GraphRefRelationalExpr
-> TransGraphEvalEnv
-> ExceptT RelationalError Identity GraphRefRelationalExpr
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT (TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
texpr) TransGraphEvalEnv
env))

liftE :: Either RelationalError a -> TransGraphEvalMonad a
liftE :: Either RelationalError a -> TransGraphEvalMonad a
liftE = ExceptT RelationalError Identity a -> TransGraphEvalMonad a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (ExceptT RelationalError Identity a -> TransGraphEvalMonad a)
-> (Either RelationalError a -> ExceptT RelationalError Identity a)
-> Either RelationalError a
-> TransGraphEvalMonad a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Either RelationalError a -> ExceptT RelationalError Identity a
forall (m :: * -> *) e a. Monad m => Either e a -> ExceptT e m a
except

askGraph :: TransGraphEvalMonad TransactionGraph
askGraph :: TransGraphEvalMonad TransactionGraph
askGraph = TransGraphEvalEnv -> TransactionGraph
tge_graph (TransGraphEvalEnv -> TransactionGraph)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     TransGraphEvalEnv
-> TransGraphEvalMonad TransactionGraph
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  TransGraphEvalEnv
forall (m :: * -> *) r. Monad m => ReaderT r m r
ask

findTransId :: TransactionIdLookup -> TransGraphEvalMonad GraphRefTransactionMarker
findTransId :: TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
tlook = TransactionId -> GraphRefTransactionMarker
TransactionMarker (TransactionId -> GraphRefTransactionMarker)
-> (Transaction -> TransactionId)
-> Transaction
-> GraphRefTransactionMarker
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Transaction -> TransactionId
transactionId (Transaction -> GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction
-> TransGraphEvalMonad GraphRefTransactionMarker
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction
findTrans TransactionIdLookup
tlook

findTrans :: TransactionIdLookup -> TransGraphEvalMonad Transaction
findTrans :: TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction
findTrans TransactionIdLookup
tlook = do
  TransactionGraph
graph <- TransGraphEvalMonad TransactionGraph
askGraph
  Either RelationalError Transaction
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction
forall a. Either RelationalError a -> TransGraphEvalMonad a
liftE (Either RelationalError Transaction
 -> ReaderT
      TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction)
-> Either RelationalError Transaction
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) Transaction
forall a b. (a -> b) -> a -> b
$ TransactionGraph
-> TransactionIdLookup -> Either RelationalError Transaction
lookupTransaction TransactionGraph
graph TransactionIdLookup
tlook

-- OUTDATED a previous attempt at this function attempted to convert TransGraphRelationalExpr to RelationalExpr by resolving the transaction lookups. However, there is no way to resolve a FunctionAtomExpr to an Atom without fully evaluating the higher levels (TupleExpr, etc.). An anonymous function expression cannot be serialized, so that workaround is out. Still, I suspect we can reuse the existing static optimizer logic to work on both structures. The current conversion reduces the chance of whole-query optimization due to full-evaluation on top of full-evaluation, so this function would benefit from some re-design.
processTransGraphRelationalExpr :: TransGraphRelationalExpr -> TransGraphEvalMonad GraphRefRelationalExpr
processTransGraphRelationalExpr :: TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr (MakeRelationFromExprs Maybe [AttributeExprBase TransactionIdLookup]
mAttrExprs TupleExprsBase TransactionIdLookup
tupleExprs) = do
  GraphRefTupleExprs
tupleExprs' <- TupleExprsBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefTupleExprs
processTransGraphTupleExprs TupleExprsBase TransactionIdLookup
tupleExprs
  case Maybe [AttributeExprBase TransactionIdLookup]
mAttrExprs of
    Maybe [AttributeExprBase TransactionIdLookup]
Nothing -> GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe [AttributeExprBase GraphRefTransactionMarker]
-> GraphRefTupleExprs -> GraphRefRelationalExpr
forall a.
Maybe [AttributeExprBase a]
-> TupleExprsBase a -> RelationalExprBase a
MakeRelationFromExprs Maybe [AttributeExprBase GraphRefTransactionMarker]
forall a. Maybe a
Nothing GraphRefTupleExprs
tupleExprs')
    Just [AttributeExprBase TransactionIdLookup]
attrExprs -> do
      [AttributeExprBase GraphRefTransactionMarker]
attrExprs' <- (AttributeExprBase TransactionIdLookup
 -> ReaderT
      TransGraphEvalEnv
      (ExceptT RelationalError Identity)
      (AttributeExprBase GraphRefTransactionMarker))
-> [AttributeExprBase TransactionIdLookup]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [AttributeExprBase GraphRefTransactionMarker]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM AttributeExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeExprBase GraphRefTransactionMarker)
processTransGraphAttributeExpr [AttributeExprBase TransactionIdLookup]
attrExprs
      GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe [AttributeExprBase GraphRefTransactionMarker]
-> GraphRefTupleExprs -> GraphRefRelationalExpr
forall a.
Maybe [AttributeExprBase a]
-> TupleExprsBase a -> RelationalExprBase a
MakeRelationFromExprs ([AttributeExprBase GraphRefTransactionMarker]
-> Maybe [AttributeExprBase GraphRefTransactionMarker]
forall a. a -> Maybe a
Just [AttributeExprBase GraphRefTransactionMarker]
attrExprs') GraphRefTupleExprs
tupleExprs')
processTransGraphRelationalExpr (MakeStaticRelation Attributes
attrs RelationTupleSet
tupSet) = GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Attributes -> RelationTupleSet -> GraphRefRelationalExpr
forall a. Attributes -> RelationTupleSet -> RelationalExprBase a
MakeStaticRelation Attributes
attrs RelationTupleSet
tupSet)
processTransGraphRelationalExpr (ExistingRelation Relation
rel) = GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Relation -> GraphRefRelationalExpr
forall a. Relation -> RelationalExprBase a
ExistingRelation Relation
rel)
processTransGraphRelationalExpr (RelationVariable RelVarName
rvname TransactionIdLookup
transLookup) = 
  RelVarName -> GraphRefTransactionMarker -> GraphRefRelationalExpr
forall a. RelVarName -> a -> RelationalExprBase a
RelationVariable RelVarName
rvname (GraphRefTransactionMarker -> GraphRefRelationalExpr)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
transLookup
processTransGraphRelationalExpr (Project AttributeNamesBase TransactionIdLookup
transAttrNames TransGraphRelationalExpr
expr) = 
  AttributeNamesBase GraphRefTransactionMarker
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
AttributeNamesBase a
-> RelationalExprBase a -> RelationalExprBase a
Project (AttributeNamesBase GraphRefTransactionMarker
 -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
transAttrNames ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphRelationalExpr (Union TransGraphRelationalExpr
exprA TransGraphRelationalExpr
exprB) =
  GraphRefRelationalExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelationalExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Union (GraphRefRelationalExpr
 -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprA ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprB
processTransGraphRelationalExpr (Join TransGraphRelationalExpr
exprA TransGraphRelationalExpr
exprB) =
  GraphRefRelationalExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelationalExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Join (GraphRefRelationalExpr
 -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprA ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprB
processTransGraphRelationalExpr (Rename RelVarName
attrName1 RelVarName
attrName2 TransGraphRelationalExpr
expr) =
  RelVarName
-> RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelVarName
-> RelVarName -> RelationalExprBase a -> RelationalExprBase a
Rename RelVarName
attrName1 RelVarName
attrName2 (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphRelationalExpr (Difference TransGraphRelationalExpr
exprA TransGraphRelationalExpr
exprB) =
  GraphRefRelationalExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelationalExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Difference (GraphRefRelationalExpr
 -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprA ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprB
processTransGraphRelationalExpr (Group AttributeNamesBase TransactionIdLookup
transAttrNames RelVarName
attrName TransGraphRelationalExpr
expr) = 
  AttributeNamesBase GraphRefTransactionMarker
-> RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
AttributeNamesBase a
-> RelVarName -> RelationalExprBase a -> RelationalExprBase a
Group (AttributeNamesBase GraphRefTransactionMarker
 -> RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
    AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
transAttrNames ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) RelVarName
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
    RelVarName
-> ReaderT
     TransGraphEvalEnv (ExceptT RelationalError Identity) RelVarName
forall (f :: * -> *) a. Applicative f => a -> f a
pure RelVarName
attrName ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
    TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphRelationalExpr (Ungroup RelVarName
attrName TransGraphRelationalExpr
expr) = 
  RelVarName -> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelVarName -> RelationalExprBase a -> RelationalExprBase a
Ungroup RelVarName
attrName (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphRelationalExpr (Restrict RestrictionPredicateExprBase TransactionIdLookup
predicateExpr TransGraphRelationalExpr
expr) =
  RestrictionPredicateExprBase GraphRefTransactionMarker
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RestrictionPredicateExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Restrict (RestrictionPredicateExprBase GraphRefTransactionMarker
 -> GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefRelationalExpr -> GraphRefRelationalExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
predicateExpr ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefRelationalExpr -> GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>
    TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphRelationalExpr (Equals TransGraphRelationalExpr
exprA TransGraphRelationalExpr
exprB) = do  
  GraphRefRelationalExpr
exprA' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprA
  GraphRefRelationalExpr
exprB' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprB 
  GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefRelationalExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelationalExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Equals GraphRefRelationalExpr
exprA' GraphRefRelationalExpr
exprB')
processTransGraphRelationalExpr (NotEquals TransGraphRelationalExpr
exprA TransGraphRelationalExpr
exprB) = do  
  GraphRefRelationalExpr
exprA' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprA 
  GraphRefRelationalExpr
exprB' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
exprB 
  GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefRelationalExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
RelationalExprBase a
-> RelationalExprBase a -> RelationalExprBase a
NotEquals GraphRefRelationalExpr
exprA' GraphRefRelationalExpr
exprB')
processTransGraphRelationalExpr (Extend ExtendTupleExprBase TransactionIdLookup
extendExpr TransGraphRelationalExpr
expr) = do
  GraphRefExtendTupleExpr
extendExpr' <- ExtendTupleExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefExtendTupleExpr
processTransGraphExtendTupleExpr ExtendTupleExprBase TransactionIdLookup
extendExpr 
  GraphRefRelationalExpr
expr' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr 
  GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefExtendTupleExpr
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
ExtendTupleExprBase a
-> RelationalExprBase a -> RelationalExprBase a
Extend GraphRefExtendTupleExpr
extendExpr' GraphRefRelationalExpr
expr')
processTransGraphRelationalExpr (With [(WithNameExprBase TransactionIdLookup, TransGraphRelationalExpr)]
views TransGraphRelationalExpr
expr) = do
  [(GraphRefWithNameExpr, GraphRefRelationalExpr)]
evaldViews <- ((WithNameExprBase TransactionIdLookup, TransGraphRelationalExpr)
 -> ReaderT
      TransGraphEvalEnv
      (ExceptT RelationalError Identity)
      (GraphRefWithNameExpr, GraphRefRelationalExpr))
-> [(WithNameExprBase TransactionIdLookup,
     TransGraphRelationalExpr)]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [(GraphRefWithNameExpr, GraphRefRelationalExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\(WithNameExprBase TransactionIdLookup
wnexpr, TransGraphRelationalExpr
vexpr) -> do
                         GraphRefWithNameExpr
wnexpr' <- WithNameExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefWithNameExpr
processTransGraphWithNameExpr WithNameExprBase TransactionIdLookup
wnexpr
                         GraphRefRelationalExpr
vexpr' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
vexpr 
                         (GraphRefWithNameExpr, GraphRefRelationalExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefWithNameExpr, GraphRefRelationalExpr)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefWithNameExpr
wnexpr', GraphRefRelationalExpr
vexpr')
                     ) [(WithNameExprBase TransactionIdLookup, TransGraphRelationalExpr)]
views
  GraphRefRelationalExpr
expr' <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr 
  GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([(GraphRefWithNameExpr, GraphRefRelationalExpr)]
-> GraphRefRelationalExpr -> GraphRefRelationalExpr
forall a.
[(WithNameExprBase a, RelationalExprBase a)]
-> RelationalExprBase a -> RelationalExprBase a
With [(GraphRefWithNameExpr, GraphRefRelationalExpr)]
evaldViews GraphRefRelationalExpr
expr')

processTransGraphTupleExprs :: TransGraphTupleExprs -> TransGraphEvalMonad GraphRefTupleExprs
processTransGraphTupleExprs :: TupleExprsBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefTupleExprs
processTransGraphTupleExprs (TupleExprs TransactionIdLookup
marker [TupleExprBase TransactionIdLookup]
texprs) =
  GraphRefTransactionMarker
-> [TupleExprBase GraphRefTransactionMarker] -> GraphRefTupleExprs
forall a. a -> [TupleExprBase a] -> TupleExprsBase a
TupleExprs (GraphRefTransactionMarker
 -> [TupleExprBase GraphRefTransactionMarker] -> GraphRefTupleExprs)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     ([TupleExprBase GraphRefTransactionMarker] -> GraphRefTupleExprs)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
marker ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  ([TupleExprBase GraphRefTransactionMarker] -> GraphRefTupleExprs)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [TupleExprBase GraphRefTransactionMarker]
-> TransGraphEvalMonad GraphRefTupleExprs
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (TupleExprBase TransactionIdLookup
 -> ReaderT
      TransGraphEvalEnv
      (ExceptT RelationalError Identity)
      (TupleExprBase GraphRefTransactionMarker))
-> [TupleExprBase TransactionIdLookup]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [TupleExprBase GraphRefTransactionMarker]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM TupleExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (TupleExprBase GraphRefTransactionMarker)
processTransGraphTupleExpr [TupleExprBase TransactionIdLookup]
texprs

processTransGraphTupleExpr :: TransGraphTupleExpr -> TransGraphEvalMonad GraphRefTupleExpr
processTransGraphTupleExpr :: TupleExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (TupleExprBase GraphRefTransactionMarker)
processTransGraphTupleExpr (TupleExpr Map RelVarName (AtomExprBase TransactionIdLookup)
attrMap) = do
  let attrAssoc :: ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  [(RelVarName, GraphRefAtomExpr)]
attrAssoc = ((RelVarName, AtomExprBase TransactionIdLookup)
 -> ReaderT
      TransGraphEvalEnv
      (ExceptT RelationalError Identity)
      (RelVarName, GraphRefAtomExpr))
-> [(RelVarName, AtomExprBase TransactionIdLookup)]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [(RelVarName, GraphRefAtomExpr)]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (\(RelVarName
attrName, AtomExprBase TransactionIdLookup
atomExpr) -> do 
                        GraphRefAtomExpr
aExpr <- AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr AtomExprBase TransactionIdLookup
atomExpr
                        (RelVarName, GraphRefAtomExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RelVarName, GraphRefAtomExpr)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RelVarName
attrName, GraphRefAtomExpr
aExpr)
                    ) (Map RelVarName (AtomExprBase TransactionIdLookup)
-> [(RelVarName, AtomExprBase TransactionIdLookup)]
forall k a. Map k a -> [(k, a)]
M.toList Map RelVarName (AtomExprBase TransactionIdLookup)
attrMap)
  Map RelVarName GraphRefAtomExpr
-> TupleExprBase GraphRefTransactionMarker
forall a. Map RelVarName (AtomExprBase a) -> TupleExprBase a
TupleExpr (Map RelVarName GraphRefAtomExpr
 -> TupleExprBase GraphRefTransactionMarker)
-> ([(RelVarName, GraphRefAtomExpr)]
    -> Map RelVarName GraphRefAtomExpr)
-> [(RelVarName, GraphRefAtomExpr)]
-> TupleExprBase GraphRefTransactionMarker
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(RelVarName, GraphRefAtomExpr)] -> Map RelVarName GraphRefAtomExpr
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList ([(RelVarName, GraphRefAtomExpr)]
 -> TupleExprBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [(RelVarName, GraphRefAtomExpr)]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (TupleExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  [(RelVarName, GraphRefAtomExpr)]
attrAssoc
  
processTransGraphAtomExpr :: TransGraphAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr :: AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr (AttributeAtomExpr RelVarName
aname) = GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr)
-> GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr
forall a b. (a -> b) -> a -> b
$ RelVarName -> GraphRefAtomExpr
forall a. RelVarName -> AtomExprBase a
AttributeAtomExpr RelVarName
aname
processTransGraphAtomExpr (NakedAtomExpr Atom
atom) = GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr)
-> GraphRefAtomExpr -> TransGraphEvalMonad GraphRefAtomExpr
forall a b. (a -> b) -> a -> b
$ Atom -> GraphRefAtomExpr
forall a. Atom -> AtomExprBase a
NakedAtomExpr Atom
atom
processTransGraphAtomExpr (FunctionAtomExpr RelVarName
funcName' [AtomExprBase TransactionIdLookup]
args TransactionIdLookup
tLookup) =
  RelVarName
-> [GraphRefAtomExpr]
-> GraphRefTransactionMarker
-> GraphRefAtomExpr
forall a. RelVarName -> [AtomExprBase a] -> a -> AtomExprBase a
FunctionAtomExpr RelVarName
funcName' ([GraphRefAtomExpr]
 -> GraphRefTransactionMarker -> GraphRefAtomExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [GraphRefAtomExpr]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefTransactionMarker -> GraphRefAtomExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (AtomExprBase TransactionIdLookup
 -> TransGraphEvalMonad GraphRefAtomExpr)
-> [AtomExprBase TransactionIdLookup]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [GraphRefAtomExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr [AtomExprBase TransactionIdLookup]
args ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefTransactionMarker -> GraphRefAtomExpr)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> TransGraphEvalMonad GraphRefAtomExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
tLookup
processTransGraphAtomExpr (RelationAtomExpr TransGraphRelationalExpr
expr) =
  GraphRefRelationalExpr -> GraphRefAtomExpr
forall a. RelationalExprBase a -> AtomExprBase a
RelationAtomExpr (GraphRefRelationalExpr -> GraphRefAtomExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> TransGraphEvalMonad GraphRefAtomExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
processTransGraphAtomExpr (ConstructedAtomExpr RelVarName
dConsName [AtomExprBase TransactionIdLookup]
args TransactionIdLookup
tLookup) =
  RelVarName
-> [GraphRefAtomExpr]
-> GraphRefTransactionMarker
-> GraphRefAtomExpr
forall a. RelVarName -> [AtomExprBase a] -> a -> AtomExprBase a
ConstructedAtomExpr RelVarName
dConsName ([GraphRefAtomExpr]
 -> GraphRefTransactionMarker -> GraphRefAtomExpr)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [GraphRefAtomExpr]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (GraphRefTransactionMarker -> GraphRefAtomExpr)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (AtomExprBase TransactionIdLookup
 -> TransGraphEvalMonad GraphRefAtomExpr)
-> [AtomExprBase TransactionIdLookup]
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     [GraphRefAtomExpr]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr [AtomExprBase TransactionIdLookup]
args ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (GraphRefTransactionMarker -> GraphRefAtomExpr)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> TransGraphEvalMonad GraphRefAtomExpr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
tLookup
evalTransGraphRestrictionPredicateExpr :: TransGraphRestrictionPredicateExpr -> TransGraphEvalMonad GraphRefRestrictionPredicateExpr
evalTransGraphRestrictionPredicateExpr :: RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
TruePredicate = RestrictionPredicateExprBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure RestrictionPredicateExprBase GraphRefTransactionMarker
forall a. RestrictionPredicateExprBase a
TruePredicate
evalTransGraphRestrictionPredicateExpr (AndPredicate RestrictionPredicateExprBase TransactionIdLookup
exprA RestrictionPredicateExprBase TransactionIdLookup
exprB) = do
  RestrictionPredicateExprBase GraphRefTransactionMarker
exprA' <- RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
exprA
  RestrictionPredicateExprBase GraphRefTransactionMarker
exprB' <- RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
exprB
  RestrictionPredicateExprBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RestrictionPredicateExprBase GraphRefTransactionMarker
-> RestrictionPredicateExprBase GraphRefTransactionMarker
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a.
RestrictionPredicateExprBase a
-> RestrictionPredicateExprBase a -> RestrictionPredicateExprBase a
AndPredicate RestrictionPredicateExprBase GraphRefTransactionMarker
exprA' RestrictionPredicateExprBase GraphRefTransactionMarker
exprB')
evalTransGraphRestrictionPredicateExpr (OrPredicate RestrictionPredicateExprBase TransactionIdLookup
exprA RestrictionPredicateExprBase TransactionIdLookup
exprB) = do  
  RestrictionPredicateExprBase GraphRefTransactionMarker
exprA' <- RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
exprA 
  RestrictionPredicateExprBase GraphRefTransactionMarker
exprB' <- RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
exprB
  RestrictionPredicateExprBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (RestrictionPredicateExprBase GraphRefTransactionMarker
-> RestrictionPredicateExprBase GraphRefTransactionMarker
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a.
RestrictionPredicateExprBase a
-> RestrictionPredicateExprBase a -> RestrictionPredicateExprBase a
OrPredicate RestrictionPredicateExprBase GraphRefTransactionMarker
exprA' RestrictionPredicateExprBase GraphRefTransactionMarker
exprB')
evalTransGraphRestrictionPredicateExpr (NotPredicate RestrictionPredicateExprBase TransactionIdLookup
expr) = do
  let expr' :: ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (RestrictionPredicateExprBase GraphRefTransactionMarker)
expr' = RestrictionPredicateExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
evalTransGraphRestrictionPredicateExpr RestrictionPredicateExprBase TransactionIdLookup
expr
  RestrictionPredicateExprBase GraphRefTransactionMarker
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a.
RestrictionPredicateExprBase a -> RestrictionPredicateExprBase a
NotPredicate (RestrictionPredicateExprBase GraphRefTransactionMarker
 -> RestrictionPredicateExprBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  (RestrictionPredicateExprBase GraphRefTransactionMarker)
expr'
evalTransGraphRestrictionPredicateExpr (RelationalExprPredicate TransGraphRelationalExpr
expr) = do  
  let expr' :: ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  GraphRefRelationalExpr
expr' = TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr
  GraphRefRelationalExpr
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a. RelationalExprBase a -> RestrictionPredicateExprBase a
RelationalExprPredicate (GraphRefRelationalExpr
 -> RestrictionPredicateExprBase GraphRefTransactionMarker)
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT
  TransGraphEvalEnv
  (ExceptT RelationalError Identity)
  GraphRefRelationalExpr
expr'
evalTransGraphRestrictionPredicateExpr (AtomExprPredicate AtomExprBase TransactionIdLookup
expr) = do
  let expr' :: TransGraphEvalMonad GraphRefAtomExpr
expr' = AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr AtomExprBase TransactionIdLookup
expr
  GraphRefAtomExpr
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a. AtomExprBase a -> RestrictionPredicateExprBase a
AtomExprPredicate (GraphRefAtomExpr
 -> RestrictionPredicateExprBase GraphRefTransactionMarker)
-> TransGraphEvalMonad GraphRefAtomExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphEvalMonad GraphRefAtomExpr
expr'
evalTransGraphRestrictionPredicateExpr (AttributeEqualityPredicate RelVarName
attrName AtomExprBase TransactionIdLookup
expr) = do  
  let expr' :: TransGraphEvalMonad GraphRefAtomExpr
expr' = AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr AtomExprBase TransactionIdLookup
expr
  RelVarName
-> GraphRefAtomExpr
-> RestrictionPredicateExprBase GraphRefTransactionMarker
forall a.
RelVarName -> AtomExprBase a -> RestrictionPredicateExprBase a
AttributeEqualityPredicate RelVarName
attrName (GraphRefAtomExpr
 -> RestrictionPredicateExprBase GraphRefTransactionMarker)
-> TransGraphEvalMonad GraphRefAtomExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (RestrictionPredicateExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransGraphEvalMonad GraphRefAtomExpr
expr'
  
processTransGraphExtendTupleExpr :: TransGraphExtendTupleExpr -> TransGraphEvalMonad GraphRefExtendTupleExpr
processTransGraphExtendTupleExpr :: ExtendTupleExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefExtendTupleExpr
processTransGraphExtendTupleExpr (AttributeExtendTupleExpr RelVarName
attrName AtomExprBase TransactionIdLookup
expr) =
  RelVarName -> GraphRefAtomExpr -> GraphRefExtendTupleExpr
forall a. RelVarName -> AtomExprBase a -> ExtendTupleExprBase a
AttributeExtendTupleExpr RelVarName
attrName (GraphRefAtomExpr -> GraphRefExtendTupleExpr)
-> TransGraphEvalMonad GraphRefAtomExpr
-> TransGraphEvalMonad GraphRefExtendTupleExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> AtomExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefAtomExpr
processTransGraphAtomExpr AtomExprBase TransactionIdLookup
expr

processTransGraphAttributeExpr :: TransGraphAttributeExpr -> TransGraphEvalMonad GraphRefAttributeExpr
processTransGraphAttributeExpr :: AttributeExprBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeExprBase GraphRefTransactionMarker)
processTransGraphAttributeExpr (AttributeAndTypeNameExpr RelVarName
attrName TypeConstructor
tCons TransactionIdLookup
tLookup) =
  RelVarName
-> TypeConstructor
-> GraphRefTransactionMarker
-> AttributeExprBase GraphRefTransactionMarker
forall a. RelVarName -> TypeConstructor -> a -> AttributeExprBase a
AttributeAndTypeNameExpr RelVarName
attrName TypeConstructor
tCons (GraphRefTransactionMarker
 -> AttributeExprBase GraphRefTransactionMarker)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
tLookup
processTransGraphAttributeExpr (NakedAttributeExpr Attribute
attr) = AttributeExprBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeExprBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Attribute -> AttributeExprBase GraphRefTransactionMarker
forall a. Attribute -> AttributeExprBase a
NakedAttributeExpr Attribute
attr)  

processTransGraphAttributeNames :: TransGraphAttributeNames -> TransGraphEvalMonad GraphRefAttributeNames
processTransGraphAttributeNames :: AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames (AttributeNames Set RelVarName
names) = AttributeNamesBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Set RelVarName -> AttributeNamesBase GraphRefTransactionMarker
forall a. Set RelVarName -> AttributeNamesBase a
AttributeNames Set RelVarName
names)
processTransGraphAttributeNames (InvertedAttributeNames Set RelVarName
names) = AttributeNamesBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Set RelVarName -> AttributeNamesBase GraphRefTransactionMarker
forall a. Set RelVarName -> AttributeNamesBase a
InvertedAttributeNames Set RelVarName
names)
processTransGraphAttributeNames (UnionAttributeNames AttributeNamesBase TransactionIdLookup
namesA AttributeNamesBase TransactionIdLookup
namesB) = do
  AttributeNamesBase GraphRefTransactionMarker
nA <- AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
namesA 
  AttributeNamesBase GraphRefTransactionMarker
nB <- AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
namesB
  AttributeNamesBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AttributeNamesBase GraphRefTransactionMarker
-> AttributeNamesBase GraphRefTransactionMarker
-> AttributeNamesBase GraphRefTransactionMarker
forall a.
AttributeNamesBase a
-> AttributeNamesBase a -> AttributeNamesBase a
UnionAttributeNames AttributeNamesBase GraphRefTransactionMarker
nA AttributeNamesBase GraphRefTransactionMarker
nB)
processTransGraphAttributeNames (IntersectAttributeNames AttributeNamesBase TransactionIdLookup
namesA AttributeNamesBase TransactionIdLookup
namesB) = do
  AttributeNamesBase GraphRefTransactionMarker
nA <- AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
namesA 
  AttributeNamesBase GraphRefTransactionMarker
nB <- AttributeNamesBase TransactionIdLookup
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
processTransGraphAttributeNames AttributeNamesBase TransactionIdLookup
namesB 
  AttributeNamesBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AttributeNamesBase GraphRefTransactionMarker
-> AttributeNamesBase GraphRefTransactionMarker
-> AttributeNamesBase GraphRefTransactionMarker
forall a.
AttributeNamesBase a
-> AttributeNamesBase a -> AttributeNamesBase a
IntersectAttributeNames AttributeNamesBase GraphRefTransactionMarker
nA AttributeNamesBase GraphRefTransactionMarker
nB)
processTransGraphAttributeNames (RelationalExprAttributeNames TransGraphRelationalExpr
expr) = do
  GraphRefRelationalExpr
evaldExpr <- TransGraphRelationalExpr
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     GraphRefRelationalExpr
processTransGraphRelationalExpr TransGraphRelationalExpr
expr 
  AttributeNamesBase GraphRefTransactionMarker
-> ReaderT
     TransGraphEvalEnv
     (ExceptT RelationalError Identity)
     (AttributeNamesBase GraphRefTransactionMarker)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (GraphRefRelationalExpr
-> AttributeNamesBase GraphRefTransactionMarker
forall a. RelationalExprBase a -> AttributeNamesBase a
RelationalExprAttributeNames GraphRefRelationalExpr
evaldExpr)

processTransGraphWithNameExpr :: TransGraphWithNameExpr -> TransGraphEvalMonad GraphRefWithNameExpr
processTransGraphWithNameExpr :: WithNameExprBase TransactionIdLookup
-> TransGraphEvalMonad GraphRefWithNameExpr
processTransGraphWithNameExpr (WithNameExpr RelVarName
rvname TransactionIdLookup
tlookup) =
  RelVarName -> GraphRefTransactionMarker -> GraphRefWithNameExpr
forall a. RelVarName -> a -> WithNameExprBase a
WithNameExpr RelVarName
rvname (GraphRefTransactionMarker -> GraphRefWithNameExpr)
-> TransGraphEvalMonad GraphRefTransactionMarker
-> TransGraphEvalMonad GraphRefWithNameExpr
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TransactionIdLookup
-> TransGraphEvalMonad GraphRefTransactionMarker
findTransId TransactionIdLookup
tlookup