@@ -16,6 +16,7 @@ import Control.Monad
16import qualified Data.Text as T
16import qualified Data.Text as T
17import GHC.Generics
17import GHC.Generics
18import Data.Binary
18import Data.Binary
19+import ProjectM36.TransactionGraph.Merge
19import Data.Either (lefts, rights)
20import Data.Either (lefts, rights)
20--import Debug.Trace
21--import Debug.Trace
@@ -263,8 +264,18 @@ createMergeTransaction newUUID (SelectedBranchMergeStrategy selectedBranch) grap
263 selectedTrans <- validateHeadName selectedBranch graph t2
264 selectedTrans <- validateHeadName selectedBranch graph t2
264 pure $ Transaction newUUID (MergeTransactionInfo (transactionUUID trans1) (transactionUUID trans2) S.empty) (transactionContext selectedTrans)
265 pure $ Transaction newUUID (MergeTransactionInfo (transactionUUID trans1) (transactionUUID trans2) S.empty) (transactionContext selectedTrans)
267+-- merge functions, relvars, individually
266−createMergeTransaction newUUID UnionMergeStrategy graph t2 = undefined
268+createMergeTransaction newUUID UnionMergeStrategy _ (t1,t2) = do
267−
269+ let contextA = transactionContext t1
270+ contextB = transactionContext t2
271+ incDeps <- unionMergeMaps PreferNeither (inclusionDependencies contextA) (inclusionDependencies contextB)
272+ relVars <- unionMergeRelVars PreferNeither (relationVariables contextA) (relationVariables contextB)
273+ atomFuncs <- unionMergeAtomFunctions PreferNeither (atomFunctions contextA) (atomFunctions contextB)
274+ notifs <- unionMergeMaps PreferNeither (notifications contextA) (notifications contextB)
275+ types <- unionMergeTypeConstructorMapping PreferNeither (typeConstructorMapping contextA) (typeConstructorMapping contextB)
276+ pure (Transaction newUUID (MergeTransactionInfo (transactionUUID t1) (transactionUUID t2) S.empty) (DatabaseContext incDeps relVars atomFuncs notifs types))
278+-- merge function, relvars, but, on error, just take the component from the preferred branch
268createMergeTransaction newUUID (UnionPreferMergeStrategy preferHead) graph t2 = undefined
279createMergeTransaction newUUID (UnionPreferMergeStrategy preferHead) graph t2 = undefined
270-- | Returns the correct Transaction for the branch name in the graph and ensures that it is one of the two transaction arguments in the tuple.
281-- | Returns the correct Transaction for the branch name in the graph and ensures that it is one of the two transaction arguments in the tuple.
@@ -334,14 +345,13 @@ mergeTransactions newUUID parentUUID mergeStrategy (headNameA, headNameB) graph
334 Just t -> Right t
345 Just t -> Right t
335 transA <- transactionForHeadErr headNameA
346 transA <- transactionForHeadErr headNameA
336 transB <- transactionForHeadErr headNameB
347 transB <- transactionForHeadErr headNameB
337− let transAid = transactionUUID transA
338− transBid = transactionUUID transB
340 disconParent <- transactionForUUID parentUUID graph
349 disconParent <- transactionForUUID parentUUID graph
341 let subHeads = M.filterWithKey (\k _ -> elem k [headNameA, headNameB]) (transactionHeadsForGraph graph)
350 let subHeads = M.filterWithKey (\k _ -> elem k [headNameA, headNameB]) (transactionHeadsForGraph graph)
342 subGraph <- subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
351 subGraph <- subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
352+ subGraph' <- filterSubGraph subGraph subHeads
344− case createMergeTransaction newUUID mergeStrategy subGraph (transA, transB) of
354+ case createMergeTransaction newUUID mergeStrategy subGraph' (transA, transB) of
345 Left err -> Left (MergeTransactionError err)
355 Left err -> Left (MergeTransactionError err)
346 Right mergedTrans -> case headNameForTransaction disconParent graph of
356 Right mergedTrans -> case headNameForTransaction disconParent graph of
347 Nothing -> Left (TransactionIsNotAHeadError parentUUID)
357 Nothing -> Left (TransactionIsNotAHeadError parentUUID)
@@ -365,4 +375,12 @@ showGraphStructureX :: TransactionGraph -> String
365showGraphStructureX graph@(TransactionGraph heads transSet) = headsInfo ++ S.foldr folder "" transSet
375showGraphStructureX graph@(TransactionGraph heads transSet) = headsInfo ++ S.foldr folder "" transSet
367 folder trans acc = acc ++ showTransactionStructureX trans graph ++ "\n"
377 folder trans acc = acc ++ showTransactionStructureX trans graph ++ "\n"
368− headsInfo = show $ M.map transactionUUID heads
378+ headsInfo = show $ M.map transactionUUID heads
380+-- | After splicing out a subgraph, run it through this function to remove references to transactions which are not in the subgraph.
381+filterSubGraph :: TransactionGraph -> TransactionHeads -> Either RelationalError TransactionGraph
382+filterSubGraph graph heads = Right $ TransactionGraph newHeads newTransSet
384+ validIds = S.map transactionUUID (transactionsForGraph graph)
385+ newTransSet = S.map (filterTransaction validIds) (transactionsForGraph graph)
386+ newHeads = M.map (filterTransaction validIds) heads