content: 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 nots graph context1 context2 = M.filter notificationFilter nots
    where
      notificationFilter (Notification chExpr _ _) = oldChangeEval /= newChangeEval && isRight oldChangeEval
        where
          oldChangeEval = evalChangeExpr chExpr (mkRelationalExprEnv context1 graph)
          newChangeEval = evalChangeExpr chExpr (mkRelationalExprEnv context2 graph)
  
      evalChangeExpr :: RelationalExpr -> RelationalExprEnv -> Either RelationalError Relation                                     
      evalChangeExpr chExpr env =
        optimizeAndEvalRelationalExpr env chExpr 
  
      
  