@@ -1,4 +1,4 @@
1−{-# LANGUAGE DeriveAnyClass, DeriveGeneric #-}
1+{-# LANGUAGE DeriveAnyClass, DeriveGeneric, FlexibleContexts #-}
22module ProjectM36.TransactionGraph where
33import ProjectM36.Base
44import ProjectM36.Error
@@ -10,14 +10,14 @@ import ProjectM36.Tuple
1010import ProjectM36.RelationalExpression
1111import ProjectM36.TransactionGraph.Merge
1212import qualified ProjectM36.DisconnectedTransaction as Discon
13+import qualified ProjectM36.Attribute as A
1314
15+import Control.Monad.Except hiding (join)
1416import qualified Data.Vector as V
15−import qualified ProjectM36.Attribute as A
1617import qualified Data.UUID as U
1718import qualified Data.Set as S
1819import qualified Data.Map as M
1920import qualified Data.List.NonEmpty as NE
20−import Control.Monad
2121import Data.Time.Clock
2222import qualified Data.Text as T
2323import GHC.Generics
@@ -264,7 +264,9 @@ evalGraphOp _ _ (DisconnectedTransaction parentId _ _) graph Rollback = case tra
264264 where
265265 newDiscon = Discon.freshTransaction parentId (schemas parentTransaction)
266266
267−evalGraphOp stamp' newId (DisconnectedTransaction parentId _ _) graph (MergeTransactions mergeStrategy headNameA headNameB) = mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB) graph
267+evalGraphOp stamp' newId (DisconnectedTransaction parentId _ _) graph (MergeTransactions mergeStrategy headNameA headNameB) = runGraphRefRelationalExprM env (mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB))
268+ where
269+ env = freshGraphRefRelationalExprEnv Nothing graph
268270
269271evalGraphOp _ _ discon graph@(TransactionGraph graphHeads transSet) (DeleteBranch branchName) = case transactionForHead branchName graph of
270272 Nothing -> Left (NoSuchHeadNameError branchName)
@@ -388,26 +390,30 @@ pathToTransaction graph currentTransaction targetTransaction accumTransSet = do
388390 else --we have some paths!
389391 Right (S.unions paths)
390392
391−mergeTransactions :: UTCTime -> TransactionId -> TransactionId -> MergeStrategy -> (HeadName, HeadName) -> TransactionGraph -> Either RelationalError (DisconnectedTransaction, TransactionGraph)
392−mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB) graph = do
393+mergeTransactions :: UTCTime -> TransactionId -> TransactionId -> MergeStrategy -> (HeadName, HeadName) -> GraphRefRelationalExprM (DisconnectedTransaction, TransactionGraph)
394+mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB) = do
395+ graph <- gfGraph
393396 let transactionForHeadErr name = case transactionForHead name graph of
394− Nothing -> Left (NoSuchHeadNameError name)
395− Just t -> Right t
396− transA <- transactionForHeadErr headNameA
397− transB <- transactionForHeadErr headNameB
398− disconParent <- transactionForId parentId graph
397+ Nothing -> throwError (NoSuchHeadNameError name)
398+ Just t -> pure t
399+ runE e = case e of
400+ Left e' -> throwError e'
401+ Right v -> pure v
402+ transA <- transactionForHeadErr headNameA
403+ transB <- transactionForHeadErr headNameB
404+ disconParent <- gfTransForId parentId
399405 let subHeads = M.filterWithKey (\k _ -> k `elem` [headNameA, headNameB]) (transactionHeadsForGraph graph)
400− subGraph <- subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
401− subGraph' <- filterSubGraph subGraph subHeads
406+ subGraph <- runE $ subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
407+ subGraph' <- runE $ filterSubGraph subGraph subHeads
402408 case createMergeTransaction stamp' newId mergeStrategy subGraph' (transA, transB) of
403− Left err -> Left (MergeTransactionError err)
409+ Left err -> throwError (MergeTransactionError err)
404410 Right mergedTrans ->
405411 case headNameForTransaction disconParent graph of
406− Nothing -> Left (TransactionIsNotAHeadError parentId)
412+ Nothing -> throwError (TransactionIsNotAHeadError parentId)
407413 Just headName -> do
408− (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
414+ (newTrans, newGraph) <- runE $ addTransactionToGraph headName mergedTrans graph
409415 case checkConstraints (concreteDatabaseContext mergedTrans) newId graph of
410− Left err -> Left err
416+ Left err -> throwError err
411417 Right _ -> do
412418 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
413419 newDiscon = Discon.freshTransaction newId (schemas newTrans)