@@ -16,6 +16,7 @@ import Control.Monad
1616import qualified Data.Text as T
1717import GHC.Generics
1818import Data.Binary
19+import ProjectM36.TransactionGraph.Merge
1920import Data.Either (lefts, rights)
2021--import Debug.Trace
2122
@@ -263,8 +264,18 @@ createMergeTransaction newUUID (SelectedBranchMergeStrategy selectedBranch) grap
263264 selectedTrans <- validateHeadName selectedBranch graph t2
264265 pure $ Transaction newUUID (MergeTransactionInfo (transactionUUID trans1) (transactionUUID trans2) S.empty) (transactionContext selectedTrans)
265266
266−createMergeTransaction newUUID UnionMergeStrategy graph t2 = undefined
267−
267+-- merge functions, relvars, individually
268+createMergeTransaction newUUID UnionMergeStrategy _ (t1,t2) = do
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))
277+
278+-- merge function, relvars, but, on error, just take the component from the preferred branch
268279createMergeTransaction newUUID (UnionPreferMergeStrategy preferHead) graph t2 = undefined
269280
270281-- | 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
334345 Just t -> Right t
335346 transA <- transactionForHeadErr headNameA
336347 transB <- transactionForHeadErr headNameB
337− let transAid = transactionUUID transA
338− transBid = transactionUUID transB
339348
340349 disconParent <- transactionForUUID parentUUID graph
341350 let subHeads = M.filterWithKey (\k _ -> elem k [headNameA, headNameB]) (transactionHeadsForGraph graph)
342351 subGraph <- subGraphOfFirstCommonAncestor graph subHeads transA transB S.empty
352+ subGraph' <- filterSubGraph subGraph subHeads
343353
344− case createMergeTransaction newUUID mergeStrategy subGraph (transA, transB) of
354+ case createMergeTransaction newUUID mergeStrategy subGraph' (transA, transB) of
345355 Left err -> Left (MergeTransactionError err)
346356 Right mergedTrans -> case headNameForTransaction disconParent graph of
347357 Nothing -> Left (TransactionIsNotAHeadError parentUUID)
@@ -365,4 +375,12 @@ showGraphStructureX :: TransactionGraph -> String
365375showGraphStructureX graph@(TransactionGraph heads transSet) = headsInfo ++ S.foldr folder "" transSet
366376 where
367377 folder trans acc = acc ++ showTransactionStructureX trans graph ++ "\n"
368− headsInfo = show $ M.map transactionUUID heads
378+ headsInfo = show $ M.map transactionUUID heads
379+
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
383+ where
384+ validIds = S.map transactionUUID (transactionsForGraph graph)
385+ newTransSet = S.map (filterTransaction validIds) (transactionsForGraph graph)
386+ newHeads = M.map (filterTransaction validIds) heads