@@ -9,6 +9,7 @@ import ProjectM36.Tuple
9import ProjectM36.RelationalExpression
9import ProjectM36.RelationalExpression
10import ProjectM36.TransactionGraph.Merge
10import ProjectM36.TransactionGraph.Merge
11import qualified ProjectM36.DisconnectedTransaction as Discon
11import qualified ProjectM36.DisconnectedTransaction as Discon
12+import qualified ProjectM36.TransactionDiffs as TD
13import qualified Data.Vector as V
14import qualified Data.Vector as V
14import qualified ProjectM36.Attribute as A
15import qualified ProjectM36.Attribute as A
@@ -66,7 +67,7 @@ bootstrapTransactionGraph stamp freshId context = TransactionGraph bootstrapHead
67 bootstrapHeads = M.singleton "master" freshTransaction
68 bootstrapHeads = M.singleton "master" freshTransaction
68 newSchemas = Schemas context M.empty
69 newSchemas = Schemas context M.empty
69− freshTransaction = Transaction freshId (TransactionInfo U.nil S.empty stamp) newSchemas
70+ freshTransaction = Transaction freshId (TransactionInfo U.nil TD.empty stamp) newSchemas
70 bootstrapTransactions = S.singleton freshTransaction
71 bootstrapTransactions = S.singleton freshTransaction
72emptyTransactionGraph :: TransactionGraph
73emptyTransactionGraph :: TransactionGraph
@@ -86,6 +87,12 @@ headNameForTransaction transaction (TransactionGraph heads _) = if M.null matchi
87 matchingTrans = M.filter (transaction ==) heads
88 matchingTrans = M.filter (transaction ==) heads
90+transactionHeadsForGraph :: TransactionGraph -> TransactionHeads
91+transactionHeadsForGraph (TransactionGraph hs _) = hs
93+transactionsForGraph :: TransactionGraph -> S.Set Transaction
94+transactionsForGraph (TransactionGraph _ ts) = ts
89transactionForId :: TransactionId -> TransactionGraph -> Either RelationalError Transaction
96transactionForId :: TransactionId -> TransactionGraph -> Either RelationalError Transaction
90transactionForId tid graph
97transactionForId tid graph
91 | tid == U.nil =
98 | tid == U.nil =
@@ -115,29 +122,28 @@ parentTransactions (Transaction _ (MergeTransactionInfo pId1 pId2 _ _) _ ) graph
117childTransactions :: Transaction -> TransactionGraph -> Either RelationalError (S.Set Transaction)
124childTransactions :: Transaction -> TransactionGraph -> Either RelationalError (S.Set Transaction)
118−childTransactions (Transaction _ (TransactionInfo _ children _) _) = transactionsForIds children
125+childTransactions trans = transactionsForIds (transactionChildIds trans)
119−childTransactions (Transaction _ (MergeTransactionInfo _ _ children _) _) = transactionsForIds children
121-- create a new commit and add it to the heads
127-- create a new commit and add it to the heads
122-- technically, the new head could be added to an existing commit, but by adding a new commit, the new head is unambiguously linked to a new commit (with a context indentical to its parent)
128-- technically, the new head could be added to an existing commit, but by adding a new commit, the new head is unambiguously linked to a new commit (with a context indentical to its parent)
123addBranch :: UTCTime -> TransactionId -> HeadName -> TransactionId -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
129addBranch :: UTCTime -> TransactionId -> HeadName -> TransactionId -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
124addBranch stamp newId newBranchName branchPointId graph = do
130addBranch stamp newId newBranchName branchPointId graph = do
125 parentTrans <- transactionForId branchPointId graph
131 parentTrans <- transactionForId branchPointId graph
126− let newTrans = Transaction newId (TransactionInfo branchPointId S.empty stamp) (schemas parentTrans)
132+ let newTrans = Transaction newId (TransactionInfo branchPointId TD.empty stamp) (schemas parentTrans)
127− addTransactionToGraph newBranchName newTrans graph
133+ addTransactionToGraph newBranchName newTrans [(newId, NoOperation)] graph
129--adds a disconnected transaction to a transaction graph at some head
135--adds a disconnected transaction to a transaction graph at some head
130addDisconnectedTransaction :: UTCTime -> TransactionId -> HeadName -> DisconnectedTransaction -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
136addDisconnectedTransaction :: UTCTime -> TransactionId -> HeadName -> DisconnectedTransaction -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
131−addDisconnectedTransaction stamp newId headName (DisconnectedTransaction parentId schemas' _) = addTransactionToGraph headName (Transaction newId (TransactionInfo parentId S.empty stamp) schemas')
137+addDisconnectedTransaction stamp newId headName discon@(DisconnectedTransaction parentId schemas' _) = addTransactionToGraph headName (Transaction newId (TransactionInfo parentId TD.empty stamp) schemas') [(newId, Discon.diffExpr discon)]
134−addTransactionToGraph :: HeadName -> Transaction -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
140+addTransactionToGraph :: HeadName -> Transaction -> TransactionDiffs -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
135−addTransactionToGraph headName newTrans graph = do
141+addTransactionToGraph headName newTrans transDiffs graph = do
136 let parentIds = transactionParentIds newTrans
142 let parentIds = transactionParentIds newTrans
137 childIds = transactionChildIds newTrans
143 childIds = transactionChildIds newTrans
138 newId = transactionId newTrans
144 newId = transactionId newTrans
139 validateIds ids = mapM (`transactionForId` graph) (S.toList ids)
145 validateIds ids = mapM (`transactionForId` graph) (S.toList ids)
140− addChildTransaction trans = transactionSetChildren trans (S.insert newId (transactionChildIds trans))
146+ addChildTransaction trans = transactionSetChildren trans (transDiffs ++ diffs trans)
141 --validate that the parent transactions are in the graph
147 --validate that the parent transactions are in the graph
142 _ <- validateIds parentIds
148 _ <- validateIds parentIds
143 when (S.size parentIds < 1) (Left $ NewTransactionMissingParentError newId)
149 when (S.size parentIds < 1) (Left $ NewTransactionMissingParentError newId)
@@ -211,12 +217,12 @@ evalGraphOp _ _ _ graph (JumpToTransaction jumpId) = case transactionForId jumpI
211 Left err -> Left err
217 Left err -> Left err
212 Right parentTrans -> Right (newTrans, graph)
218 Right parentTrans -> Right (newTrans, graph)
214− newTrans = DisconnectedTransaction jumpId (schemas parentTrans) False
220+ newTrans = DisconnectedTransaction jumpId (schemas parentTrans) NoOperation
216-- switch from one head to another
222-- switch from one head to another
217evalGraphOp _ _ _ graph (JumpToHead headName) =
223evalGraphOp _ _ _ graph (JumpToHead headName) =
218 case transactionForHead headName graph of
224 case transactionForHead headName graph of
219− Just newHeadTransaction -> let disconnectedTrans = DisconnectedTransaction (transactionId newHeadTransaction) (schemas newHeadTransaction) False in
225+ Just newHeadTransaction -> let disconnectedTrans = DisconnectedTransaction (transactionId newHeadTransaction) (schemas newHeadTransaction) NoOperation in
220 Right (disconnectedTrans, graph)
226 Right (disconnectedTrans, graph)
221 Nothing -> Left $ NoSuchHeadNameError headName
227 Nothing -> Left $ NoSuchHeadNameError headName
@@ -226,7 +232,7 @@ evalGraphOp _ _ discon graph (WalkBackToTime backTime) = do
226 case transactionForId jumpDest graph of
232 case transactionForId jumpDest graph of
227 Left err -> Left err
233 Left err -> Left err
228 Right trans -> do
234 Right trans -> do
229− let disconnectedTrans = DisconnectedTransaction (transactionId trans) (schemas trans) False
235+ let disconnectedTrans = Discon.freshTransaction (transactionId trans) (schemas trans)
230 Right (disconnectedTrans, graph)
236 Right (disconnectedTrans, graph)
232-- add new head pointing to branchPoint
238-- add new head pointing to branchPoint
@@ -245,7 +251,7 @@ evalGraphOp newId discon@(DisconnectedTransaction parentId disconContext) graph
245-- create a new commit and add it to the heads
251-- create a new commit and add it to the heads
246-- technically, the new head could be added to an existing commit, but by adding a new commit, the new head is unambiguously linked to a new commit (with a context indentical to its parent)
252-- technically, the new head could be added to an existing commit, but by adding a new commit, the new head is unambiguously linked to a new commit (with a context indentical to its parent)
247evalGraphOp stamp newId (DisconnectedTransaction parentId schemas' _) graph (Branch newBranchName) = do
253evalGraphOp stamp newId (DisconnectedTransaction parentId schemas' _) graph (Branch newBranchName) = do
248− let newDiscon = DisconnectedTransaction newId schemas' False
254+ let newDiscon = Discon.freshTransaction newId schemas'
249 case addBranch stamp newId newBranchName parentId graph of
255 case addBranch stamp newId newBranchName parentId graph of
250 Left err -> Left err
256 Left err -> Left err
251 Right (_, newGraph) -> Right (newDiscon, newGraph)
257 Right (_, newGraph) -> Right (newDiscon, newGraph)
@@ -260,7 +266,7 @@ evalGraphOp stamp newTransId discon@(DisconnectedTransaction parentId schemas' _
260 Left err-> Left err
266 Left err-> Left err
261 Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph)
267 Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph)
263− newDisconnectedTrans = DisconnectedTransaction newTransId schemas' False
269+ newDisconnectedTrans = Discon.freshTransaction newTransId schemas'
264 maybeUpdatedGraph = addDisconnectedTransaction stamp newTransId headName discon graph
270 maybeUpdatedGraph = addDisconnectedTransaction stamp newTransId headName discon graph
266-- refresh the disconnected transaction, return the same graph
272-- refresh the disconnected transaction, return the same graph
@@ -268,7 +274,7 @@ evalGraphOp _ _ (DisconnectedTransaction parentId _ _) graph Rollback = case tra
268 Left err -> Left err
274 Left err -> Left err
269 Right parentTransaction -> Right (newDiscon, graph)
275 Right parentTransaction -> Right (newDiscon, graph)
271− newDiscon = DisconnectedTransaction parentId (schemas parentTransaction) False
277+ newDiscon = Discon.freshTransaction parentId (schemas parentTransaction)
273evalGraphOp stamp newId (DisconnectedTransaction parentId _ _) graph (MergeTransactions mergeStrategy headNameA headNameB) = mergeTransactions stamp newId parentId mergeStrategy (headNameA, headNameB) graph
279evalGraphOp stamp newId (DisconnectedTransaction parentId _ _) graph (MergeTransactions mergeStrategy headNameA headNameB) = mergeTransactions stamp newId parentId mergeStrategy (headNameA, headNameB) graph
@@ -322,7 +328,7 @@ evalROGraphOp discon graph ShowGraph = do
322createMergeTransaction :: UTCTime -> TransactionId -> MergeStrategy -> TransactionGraph -> (Transaction, Transaction) -> Either MergeError Transaction
328createMergeTransaction :: UTCTime -> TransactionId -> MergeStrategy -> TransactionGraph -> (Transaction, Transaction) -> Either MergeError Transaction
323createMergeTransaction stamp newId (SelectedBranchMergeStrategy selectedBranch) graph t2@(trans1, trans2) = do
329createMergeTransaction stamp newId (SelectedBranchMergeStrategy selectedBranch) graph t2@(trans1, trans2) = do
324 let selectedTrans = validateHeadName selectedBranch graph t2
330 let selectedTrans = validateHeadName selectedBranch graph t2
325− Transaction newId (MergeTransactionInfo (transactionId trans1) (transactionId trans2) S.empty stamp) . schemas <$> selectedTrans
331+ Transaction newId (MergeTransactionInfo (transactionId trans1) (transactionId trans2) TD.empty stamp) . schemas <$> selectedTrans
327-- merge functions, relvars, individually
333-- merge functions, relvars, individually
328createMergeTransaction stamp newId strat@UnionMergeStrategy graph t2 = createUnionMergeTransaction stamp newId strat graph t2
334createMergeTransaction stamp newId strat@UnionMergeStrategy graph t2 = createUnionMergeTransaction stamp newId strat graph t2
@@ -410,7 +416,7 @@ mergeTransactions stamp newId parentId mergeStrategy (headNameA, headNameB) grap
410 Right _ -> case headNameForTransaction disconParent graph of
416 Right _ -> case headNameForTransaction disconParent graph of
411 Nothing -> Left (TransactionIsNotAHeadError parentId)
417 Nothing -> Left (TransactionIsNotAHeadError parentId)
412 Just headName -> do
418 Just headName -> do
413− (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
419+ (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans ??? graph
414 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
420 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
415 newDiscon = DisconnectedTransaction newId (schemas newTrans) False
421 newDiscon = DisconnectedTransaction newId (schemas newTrans) False
416 pure (newDiscon, newGraph')
422 pure (newDiscon, newGraph')
@@ -468,7 +474,7 @@ createUnionMergeTransaction stamp newId strategy graph (t1,t2) = do
468 typeConstructorMapping = types
474 typeConstructorMapping = types
470 newSchemas = Schemas newContext (subschemas t1)
476 newSchemas = Schemas newContext (subschemas t1)
471− pure (Transaction newId (MergeTransactionInfo (transactionId t1) (transactionId t2) S.empty stamp) newSchemas)
477+ pure (Transaction newId (MergeTransactionInfo (transactionId t1) (transactionId t2) TD.empty stamp) newSchemas)
473lookupTransaction :: TransactionGraph -> TransactionIdLookup -> Either RelationalError Transaction
479lookupTransaction :: TransactionGraph -> TransactionIdLookup -> Either RelationalError Transaction
474lookupTransaction graph (TransactionIdLookup tid) = transactionForId tid graph
480lookupTransaction graph (TransactionIdLookup tid) = transactionForId tid graph
@@ -542,4 +548,4 @@ autoMergeToHead stamp (tempBranchTransId, tempCommitTransId, mergeTransId) disco
543 pure (discon''''', graph''''')
549 pure (discon''''', graph''''')