module ProjectM36.Notifications where
import ProjectM36.Base
import ProjectM36.Error
import ProjectM36.RelationalExpression
import ProjectM36.StaticOptimizer
import qualified Data.Map as M
import Data.Either (isRight)

-- | Returns the notifications which should be triggered based on the transition from the first 'DatabaseContext' to the second 'DatabaseContext'.
notificationChanges :: Notifications -> TransactionGraph -> DatabaseContext -> DatabaseContext -> Notifications
notificationChanges :: Notifications
-> TransactionGraph
-> DatabaseContext
-> DatabaseContext
-> Notifications
notificationChanges Notifications
nots TransactionGraph
graph DatabaseContext
context1 DatabaseContext
context2 = (Notification -> Bool) -> Notifications -> Notifications
forall a k. (a -> Bool) -> Map k a -> Map k a
M.filter Notification -> Bool
notificationFilter Notifications
nots
  where
    notificationFilter :: Notification -> Bool
notificationFilter (Notification RelationalExpr
chExpr RelationalExpr
_ RelationalExpr
_) = Either RelationalError Relation
oldChangeEval Either RelationalError Relation
-> Either RelationalError Relation -> Bool
forall a. Eq a => a -> a -> Bool
/= Either RelationalError Relation
newChangeEval Bool -> Bool -> Bool
&& Either RelationalError Relation -> Bool
forall a b. Either a b -> Bool
isRight Either RelationalError Relation
oldChangeEval
      where
        oldChangeEval :: Either RelationalError Relation
oldChangeEval = RelationalExpr
-> RelationalExprEnv -> Either RelationalError Relation
evalChangeExpr RelationalExpr
chExpr (DatabaseContext -> TransactionGraph -> RelationalExprEnv
mkRelationalExprEnv DatabaseContext
context1 TransactionGraph
graph)
        newChangeEval :: Either RelationalError Relation
newChangeEval = RelationalExpr
-> RelationalExprEnv -> Either RelationalError Relation
evalChangeExpr RelationalExpr
chExpr (DatabaseContext -> TransactionGraph -> RelationalExprEnv
mkRelationalExprEnv DatabaseContext
context2 TransactionGraph
graph)

    evalChangeExpr :: RelationalExpr -> RelationalExprEnv -> Either RelationalError Relation                                     
    evalChangeExpr :: RelationalExpr
-> RelationalExprEnv -> Either RelationalError Relation
evalChangeExpr RelationalExpr
chExpr RelationalExprEnv
env =
      RelationalExprEnv
-> RelationalExpr -> Either RelationalError Relation
optimizeAndEvalRelationalExpr RelationalExprEnv
env RelationalExpr
chExpr