@@ -19,6 +19,11 @@ import ProjectM36.TransactionGraph.Merge
1919import Data.Either (lefts, rights, isRight)
2020import Data.Monoid
2121
22+import Debug.Trace
23+import Control.Monad.Reader
24+import ProjectM36.RelationalExpression
25+import qualified ProjectM36.DisconnectedTransaction as D
26+
2227-- | Record a lookup for a specific transaction in the graph.
2328data TransactionIdLookup = TransactionIdLookup TransactionId |
2429 TransactionIdHeadNameLookup HeadName [TransactionIdHeadBacktrack]
@@ -381,13 +386,15 @@ mergeTransactions newId parentId mergeStrategy (headNameA, headNameB) graph = do
381386 subGraph' <- filterSubGraph subGraph subHeads
382387 case createMergeTransaction newId mergeStrategy subGraph' (transA, transB) of
383388 Left err -> Left (MergeTransactionError err)
384− Right mergedTrans -> case headNameForTransaction disconParent graph of
385− Nothing -> Left (TransactionIsNotAHeadError parentId)
386− Just headName -> do
387− (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
388− let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
389− newDiscon = DisconnectedTransaction newId (schemas newTrans) False
390− pure (newDiscon, newGraph')
389+ Right mergedTrans -> case checkConstraints (concreteDatabaseContext mergedTrans) of
390+ Just err -> Left err
391+ Nothing -> case headNameForTransaction disconParent graph of
392+ Nothing -> Left (TransactionIsNotAHeadError parentId)
393+ Just headName -> do
394+ (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
395+ let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
396+ newDiscon = DisconnectedTransaction newId (schemas newTrans) False
397+ pure (newDiscon, newGraph')
391398
392399--TEMPORARY COPY/PASTE
393400showTransactionStructureX :: Transaction -> TransactionGraph -> String
@@ -480,13 +487,24 @@ backtrackGraph graph currentTid (TransactionIdHeadBranchBacktrack steps) = do
480487
481488-- | Create a temporary branch for commit, merge the result to head, delete the temporary branch. This is useful to atomically commit a transaction, avoiding a TransactionIsNotHeadError but trading it for a potential MergeError.
482489--this is not a GraphOp because it combines multiple graph operations
483−autoMergeToHead :: (TransactionId, TransactionId) -> DisconnectedTransaction -> HeadName -> MergeStrategy -> TransactionGraph -> Either RelationalError (DisconnectedTransaction, TransactionGraph)
484−autoMergeToHead (tempTransId, newCommitTransId) discon mergeToHeadName strat graph = do
485− let tempBranchName = "mergebranch_" <> U.toText tempTransId
490+autoMergeToHead :: (TransactionId, TransactionId, TransactionId) -> DisconnectedTransaction -> HeadName -> MergeStrategy -> TransactionGraph -> Either RelationalError (DisconnectedTransaction, TransactionGraph)
491+autoMergeToHead (tempBranchTransId, tempCommitTransId, mergeTransId) discon mergeToHeadName strat graph = do
492+ let tempBranchName = "mergebranch_" <> U.toText tempBranchTransId
486493 --create the temp branch
487− (discon', graph') <- evalGraphOp tempTransId discon graph (Branch tempBranchName)
494+ (discon', graph') <- evalGraphOp tempBranchTransId discon graph (Branch tempBranchName)
495+
496+ --commit to the new branch- possible future optimization: don't require fsync for this- create a temp commit type
497+ (discon'', graph'') <- evalGraphOp tempCommitTransId discon' graph' Commit
498+
488499 --create the merge
489− (discon'', graph'') <- evalGraphOp newCommitTransId discon' graph' (MergeTransactions strat tempBranchName mergeToHeadName)
500+ (discon''', graph''') <- evalGraphOp mergeTransId discon'' graph'' (MergeTransactions strat tempBranchName mergeToHeadName)
501+
490502 --delete the temp branch
491− evalGraphOp newCommitTransId discon'' graph'' (DeleteBranch tempBranchName)
503+ (discon'''', graph'''') <- evalGraphOp tempBranchTransId discon''' graph''' (DeleteBranch tempBranchName)
504+
505+ let rel = runReader (evalRelationalExpr (RelationVariable "s" ())) (mkRelationalExprState $ D.concreteDatabaseContext discon'''')
506+ traceShowM rel
507+ pure (discon'''', graph'''')
508+
509+
492510