Skip to content

Commit

Permalink
add more context to the StrategyViolatesRelationVariableMergeError fo…
Browse files Browse the repository at this point in the history
…r debugging #364
  • Loading branch information
agentm committed Jan 9, 2024
1 parent 4b0200a commit 92ccd19
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 5 deletions.
2 changes: 1 addition & 1 deletion src/lib/ProjectM36/Error.hs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ data MergeError = SelectedHeadMismatchMergeError |
InvalidMergeStrategyError MergeStrategy | -- this is an internal coding error
DisconnectedTransactionNotAMergeHeadError TransactionId |
StrategyViolatesComponentMergeError | --failed merge in inc deps, relvars, etc.
StrategyViolatesRelationVariableMergeError |
StrategyViolatesRelationVariableMergeError (Maybe RelationalError) |
StrategyViolatesTypeConstructorMergeError |
StrategyViolatesRegisteredQueryMergeError [RegisteredQueryName]
deriving (Show, Eq, Generic, Typeable)
Expand Down
7 changes: 4 additions & 3 deletions src/lib/ProjectM36/TransactionGraph/Merge.hs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import qualified Data.Text as T

data MergePreference = PreferFirst | PreferSecond | PreferNeither


-- Check for overlapping keys. If the values differ, try a preference resolution
unionMergeMaps :: (Ord k, Eq a) => MergePreference -> M.Map k a -> M.Map k a -> Either MergeError (M.Map k a)
unionMergeMaps prefer mapA mapB = case prefer of
Expand All @@ -26,14 +27,14 @@ unionMergeMaps prefer mapA mapB = case prefer of
unionMergeRelation :: MergePreference -> GraphRefRelationalExpr -> GraphRefRelationalExpr -> GraphRefRelationalExprM GraphRefRelationalExpr
unionMergeRelation prefer relA relB = do
let unioned = Union relA relB
mergeErr = MergeTransactionError StrategyViolatesRelationVariableMergeError
mergeErr = MergeTransactionError . StrategyViolatesRelationVariableMergeError
preferredRelVar =
case prefer of
PreferFirst -> pure relA
PreferSecond -> pure relB
PreferNeither -> throwError mergeErr
PreferNeither -> throwError (mergeErr Nothing)
handler AttributeNamesMismatchError{} = preferredRelVar
handler _err' = throwError mergeErr
handler err = throwError (mergeErr (Just err))
--typecheck first?
(evalGraphRefRelationalExpr unioned >> pure (Union relA relB)) `catchError` handler

Expand Down
5 changes: 4 additions & 1 deletion test/TransactionGraph/Merge.hs
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,10 @@ testUnionMergeStrategy = TestCase $ do
gfEnv' = freshGraphRefRelationalExprEnv Nothing graph'''
case failingMerge of
Right _ -> assertFailure "expected merge failure"
Left err -> assertEqual "merge failure" err (MergeTransactionError StrategyViolatesRelationVariableMergeError)
Left err ->
let expectedErr = MergeTransactionError (StrategyViolatesRelationVariableMergeError (Just EmptyAttributesError))
in
assertEqual "merge failure" err expectedErr

-- test that a merge will fail if a constraint is violated
testUnionMergeIncDepViolation :: Test
Expand Down

0 comments on commit 92ccd19

Please sign in to comment.