@@ -9,6 +9,7 @@ import ProjectM36.Tuple
99import ProjectM36.RelationalExpression
1010import ProjectM36.TransactionGraph.Merge
1111import qualified ProjectM36.DisconnectedTransaction as Discon
12+import qualified ProjectM36.TransactionDiffs as TD
1213
1314import qualified Data.Vector as V
1415import qualified ProjectM36.Attribute as A
@@ -66,7 +67,7 @@ bootstrapTransactionGraph stamp freshId context = TransactionGraph bootstrapHead
6667 where
6768 bootstrapHeads = M.singleton "master" freshTransaction
6869 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
7071 bootstrapTransactions = S.singleton freshTransaction
7172
7273emptyTransactionGraph :: TransactionGraph
@@ -86,6 +87,12 @@ headNameForTransaction transaction (TransactionGraph heads _) = if M.null matchi
8687 where
8788 matchingTrans = M.filter (transaction ==) heads
8889
90+transactionHeadsForGraph :: TransactionGraph -> TransactionHeads
91+transactionHeadsForGraph (TransactionGraph hs _) = hs
92+
93+transactionsForGraph :: TransactionGraph -> S.Set Transaction
94+transactionsForGraph (TransactionGraph _ ts) = ts
95+
8996transactionForId :: TransactionId -> TransactionGraph -> Either RelationalError Transaction
9097transactionForId tid graph
9198 | tid == U.nil =
@@ -115,29 +122,28 @@ parentTransactions (Transaction _ (MergeTransactionInfo pId1 pId2 _ _) _ ) graph
115122
116123
117124childTransactions :: Transaction -> TransactionGraph -> Either RelationalError (S.Set Transaction)
118−childTransactions (Transaction _ (TransactionInfo _ children _) _) = transactionsForIds children
119−childTransactions (Transaction _ (MergeTransactionInfo _ _ children _) _) = transactionsForIds children
125+childTransactions trans = transactionsForIds (transactionChildIds trans)
120126
121127-- create a new commit and add it to the heads
122128-- 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)
123129addBranch :: UTCTime -> TransactionId -> HeadName -> TransactionId -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
124130addBranch stamp newId newBranchName branchPointId graph = do
125131 parentTrans <- transactionForId branchPointId graph
126− let newTrans = Transaction newId (TransactionInfo branchPointId S.empty stamp) (schemas parentTrans)
127− addTransactionToGraph newBranchName newTrans graph
132+ let newTrans = Transaction newId (TransactionInfo branchPointId TD.empty stamp) (schemas parentTrans)
133+ addTransactionToGraph newBranchName newTrans [(newId, NoOperation)] graph
128134
129135--adds a disconnected transaction to a transaction graph at some head
130136addDisconnectedTransaction :: 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)]
132138
133139
134−addTransactionToGraph :: HeadName -> Transaction -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
135−addTransactionToGraph headName newTrans graph = do
140+addTransactionToGraph :: HeadName -> Transaction -> TransactionDiffs -> TransactionGraph -> Either RelationalError (Transaction, TransactionGraph)
141+addTransactionToGraph headName newTrans transDiffs graph = do
136142 let parentIds = transactionParentIds newTrans
137143 childIds = transactionChildIds newTrans
138144 newId = transactionId newTrans
139145 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)
141147 --validate that the parent transactions are in the graph
142148 _ <- validateIds parentIds
143149 when (S.size parentIds < 1) (Left $ NewTransactionMissingParentError newId)
@@ -211,12 +217,12 @@ evalGraphOp _ _ _ graph (JumpToTransaction jumpId) = case transactionForId jumpI
211217 Left err -> Left err
212218 Right parentTrans -> Right (newTrans, graph)
213219 where
214− newTrans = DisconnectedTransaction jumpId (schemas parentTrans) False
220+ newTrans = DisconnectedTransaction jumpId (schemas parentTrans) NoOperation
215221
216222-- switch from one head to another
217223evalGraphOp _ _ _ graph (JumpToHead headName) =
218224 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
220226 Right (disconnectedTrans, graph)
221227 Nothing -> Left $ NoSuchHeadNameError headName
222228
@@ -226,7 +232,7 @@ evalGraphOp _ _ discon graph (WalkBackToTime backTime) = do
226232 case transactionForId jumpDest graph of
227233 Left err -> Left err
228234 Right trans -> do
229− let disconnectedTrans = DisconnectedTransaction (transactionId trans) (schemas trans) False
235+ let disconnectedTrans = Discon.freshTransaction (transactionId trans) (schemas trans)
230236 Right (disconnectedTrans, graph)
231237
232238-- add new head pointing to branchPoint
@@ -245,7 +251,7 @@ evalGraphOp newId discon@(DisconnectedTransaction parentId disconContext) graph
245251-- create a new commit and add it to the heads
246252-- 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)
247253evalGraphOp stamp newId (DisconnectedTransaction parentId schemas' _) graph (Branch newBranchName) = do
248− let newDiscon = DisconnectedTransaction newId schemas' False
254+ let newDiscon = Discon.freshTransaction newId schemas'
249255 case addBranch stamp newId newBranchName parentId graph of
250256 Left err -> Left err
251257 Right (_, newGraph) -> Right (newDiscon, newGraph)
@@ -260,7 +266,7 @@ evalGraphOp stamp newTransId discon@(DisconnectedTransaction parentId schemas' _
260266 Left err-> Left err
261267 Right (_, updatedGraph) -> Right (newDisconnectedTrans, updatedGraph)
262268 where
263− newDisconnectedTrans = DisconnectedTransaction newTransId schemas' False
269+ newDisconnectedTrans = Discon.freshTransaction newTransId schemas'
264270 maybeUpdatedGraph = addDisconnectedTransaction stamp newTransId headName discon graph
265271
266272-- refresh the disconnected transaction, return the same graph
@@ -268,7 +274,7 @@ evalGraphOp _ _ (DisconnectedTransaction parentId _ _) graph Rollback = case tra
268274 Left err -> Left err
269275 Right parentTransaction -> Right (newDiscon, graph)
270276 where
271− newDiscon = DisconnectedTransaction parentId (schemas parentTransaction) False
277+ newDiscon = Discon.freshTransaction parentId (schemas parentTransaction)
272278
273279evalGraphOp stamp newId (DisconnectedTransaction parentId _ _) graph (MergeTransactions mergeStrategy headNameA headNameB) = mergeTransactions stamp newId parentId mergeStrategy (headNameA, headNameB) graph
274280
@@ -322,7 +328,7 @@ evalROGraphOp discon graph ShowGraph = do
322328createMergeTransaction :: UTCTime -> TransactionId -> MergeStrategy -> TransactionGraph -> (Transaction, Transaction) -> Either MergeError Transaction
323329createMergeTransaction stamp newId (SelectedBranchMergeStrategy selectedBranch) graph t2@(trans1, trans2) = do
324330 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
326332
327333-- merge functions, relvars, individually
328334createMergeTransaction stamp newId strat@UnionMergeStrategy graph t2 = createUnionMergeTransaction stamp newId strat graph t2
@@ -410,7 +416,7 @@ mergeTransactions stamp newId parentId mergeStrategy (headNameA, headNameB) grap
410416 Right _ -> case headNameForTransaction disconParent graph of
411417 Nothing -> Left (TransactionIsNotAHeadError parentId)
412418 Just headName -> do
413− (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans graph
419+ (newTrans, newGraph) <- addTransactionToGraph headName mergedTrans ??? graph
414420 let newGraph' = TransactionGraph (transactionHeadsForGraph newGraph) (transactionsForGraph newGraph)
415421 newDiscon = DisconnectedTransaction newId (schemas newTrans) False
416422 pure (newDiscon, newGraph')
@@ -468,7 +474,7 @@ createUnionMergeTransaction stamp newId strategy graph (t1,t2) = do
468474 typeConstructorMapping = types
469475 }
470476 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)
472478
473479lookupTransaction :: TransactionGraph -> TransactionIdLookup -> Either RelationalError Transaction
474480lookupTransaction graph (TransactionIdLookup tid) = transactionForId tid graph
@@ -542,4 +548,4 @@ autoMergeToHead stamp (tempBranchTransId, tempCommitTransId, mergeTransId) disco
542548
543549 pure (discon''''', graph''''')
544550
545−
551+