@@ -1,4 +1,4 @@
1−{-# LANGUAGE DeriveAnyClass, DeriveGeneric #-}
1+{-# LANGUAGE DeriveAnyClass, DeriveGeneric, FlexibleContexts #-}
2module ProjectM36.TransactionGraph where
2module ProjectM36.TransactionGraph where
3import ProjectM36.Base
3import ProjectM36.Base
4import ProjectM36.Error
4import ProjectM36.Error
@@ -10,14 +10,14 @@ import ProjectM36.Tuple
10import ProjectM36.RelationalExpression
10import ProjectM36.RelationalExpression
11import ProjectM36.TransactionGraph.Merge
11import ProjectM36.TransactionGraph.Merge
12import qualified ProjectM36.DisconnectedTransaction as Discon
12import qualified ProjectM36.DisconnectedTransaction as Discon
13+import qualified ProjectM36.Attribute as A
15+import Control.Monad.Except hiding (join)
14import qualified Data.Vector as V
16import qualified Data.Vector as V
15−import qualified ProjectM36.Attribute as A
16import qualified Data.UUID as U
17import qualified Data.UUID as U
17import qualified Data.Set as S
18import qualified Data.Set as S
18import qualified Data.Map as M
19import qualified Data.Map as M
19import qualified Data.List.NonEmpty as NE
20import qualified Data.List.NonEmpty as NE
21import Data.Time.Clock
21import Data.Time.Clock
22import qualified Data.Text as T
22import qualified Data.Text as T
23import GHC.Generics
23import GHC.Generics
@@ -264,7 +264,9 @@ evalGraphOp _ _ (DisconnectedTransaction parentId _ _) graph Rollback = case tra
265 newDiscon = Discon.freshTransaction parentId (schemas parentTransaction)
265 newDiscon = Discon.freshTransaction parentId (schemas parentTransaction)
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))
269+ env = freshGraphRefRelationalExprEnv Nothing graph
269evalGraphOp _ _ discon graph@(TransactionGraph graphHeads transSet) (DeleteBranch branchName) = case transactionForHead branchName graph of
271evalGraphOp _ _ discon graph@(TransactionGraph graphHeads transSet) (DeleteBranch branchName) = case transactionForHead branchName graph of
270 Nothing -> Left (NoSuchHeadNameError branchName)
272 Nothing -> Left (NoSuchHeadNameError branchName)
@@ -388,26 +390,30 @@ pathToTransaction graph currentTransaction targetTransaction accumTransSet = do
388 else --we have some paths!
390 else --we have some paths!
389 Right (S.unions paths)
391 Right (S.unions paths)
391−mergeTransactions :: UTCTime -> TransactionId -> TransactionId -> MergeStrategy -> (HeadName, HeadName) -> TransactionGraph -> Either RelationalError (DisconnectedTransaction, TransactionGraph)
393+mergeTransactions :: UTCTime -> TransactionId -> TransactionId -> MergeStrategy -> (HeadName, HeadName) -> GraphRefRelationalExprM (DisconnectedTransaction, TransactionGraph)
392−mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB) graph = do
394+mergeTransactions stamp' newId parentId mergeStrategy (headNameA, headNameB) = do
393 let transactionForHeadErr name = case transactionForHead name graph of
396 let transactionForHeadErr name = case transactionForHead name graph of
394− Nothing -> Left (NoSuchHeadNameError name)
397+ Nothing -> throwError (NoSuchHeadNameError name)
395− Just t -> Right t
398+ Just t -> pure t
400+ Left e' -> throwError e'
396− transA <- transactionForHeadErr headNameA
402+ transA <- transactionForHeadErr headNameA
397− transB <- transactionForHeadErr headNameB
403+ transB <- transactionForHeadErr headNameB
398− disconParent <- transactionForId parentId graph
404+ disconParent <- gfTransForId parentId
399 let subHeads = M.filterWithKey (\k _ -> k `elem` [headNameA, headNameB]) (transactionHeadsForGraph graph)
405 let subHeads = M.filterWithKey (\k _ -> k `elem` [headNameA, headNameB]) (transactionHeadsForGraph graph)
400− subGraph <- subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
406+ subGraph <- runE $ subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
401− subGraph' <- filterSubGraph subGraph subHeads
407+ subGraph' <- runE $ filterSubGraph subGraph subHeads
402 case createMergeTransaction stamp' newId mergeStrategy subGraph' (transA, transB) of
408 case createMergeTransaction stamp' newId mergeStrategy subGraph' (transA, transB) of
403− Left err -> Left (MergeTransactionError err)
409+ Left err -> throwError (MergeTransactionError err)
404 Right mergedTrans ->
410 Right mergedTrans ->
405 case headNameForTransaction disconParent graph of
411 case headNameForTransaction disconParent graph of
406− Nothing -> Left (TransactionIsNotAHeadError parentId)
412+ Nothing -> throwError (TransactionIsNotAHeadError parentId)
407 Just headName -> do
413 Just headName -> do
408− (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
414+ (newTrans, newGraph) <- runE $ addTransactionToGraph headName mergedTrans graph
409 case checkConstraints (concreteDatabaseContext mergedTrans) newId graph of
415 case checkConstraints (concreteDatabaseContext mergedTrans) newId graph of
410− Left err -> Left err
416+ Left err -> throwError err
411 Right _ -> do
417 Right _ -> do
412 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
418 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
413 newDiscon = Discon.freshTransaction newId (schemas newTrans)
419 newDiscon = Discon.freshTransaction newId (schemas newTrans)