on master help sign in
all merge tests pass
commita1f21a45b2bb5bb525ca895a719c1c9c2869216a authorAgentM <agentm@themactionfaction.com> dateSun 10 May 2020, 00:02 (6 years ago) parentf407d5d
3 files changed+16−20
src/lib/ProjectM36/RelationalExpression.hs−2 src/lib/ProjectM36/TransactionGraph/Merge.hs+14−16 test/TransactionGraph/Merge.hs+2−2
src/lib/ProjectM36/RelationalExpression.hs−2
@@ -43,8 +43,6 @@ import Data.Time.Calendar
4343import qualified Data.List.NonEmpty as NE
4444import Data.Functor.Identity
4545
46−--import Debug.Trace
47−
4846data DatabaseContextExprDetails = CountUpdatedTuples
4947
5048databaseContextExprDetailsFunc :: DatabaseContextExprDetails -> ResultAccumFunc
src/lib/ProjectM36/TransactionGraph/Merge.hs+14−16
@@ -7,7 +7,6 @@ import Control.Monad.Except hiding (join)
77import qualified Data.Set as S
88import qualified Data.Map as M
99import qualified ProjectM36.TypeConstructorDef as TCD
10−import ProjectM36.Relation
1110import Control.Monad (foldM)
1211import qualified Data.HashSet as HS
1312
@@ -24,16 +23,19 @@ unionMergeMaps prefer mapA mapB = case prefer of
2423 Left StrategyViolatesComponentMergeError
2524
2625-- perform the merge even if the attributes are different- is this what we want? Obviously, we need finer-grained merge options.
27−unionMergeRelation :: MergePreference -> Relation -> Relation -> Either MergeError Relation
28−unionMergeRelation prefer relA relB = case relA `union` relB of
29− Right unionRel -> pure unionRel
30− Left (AttributeNamesMismatchError _) -> preferredRelVar
31− Left _ -> Left StrategyViolatesRelationVariableMergeError
32− where
33− preferredRelVar = case prefer of
34− PreferFirst -> Right relA
35− PreferSecond -> Right relB
36− PreferNeither -> Left StrategyViolatesRelationVariableMergeError
26+unionMergeRelation :: MergePreference -> GraphRefRelationalExpr -> GraphRefRelationalExpr -> GraphRefRelationalExprM GraphRefRelationalExpr
27+unionMergeRelation prefer relA relB = do
28+ let unioned = Union relA relB
29+ mergeErr = MergeTransactionError StrategyViolatesRelationVariableMergeError
30+ preferredRelVar =
31+ case prefer of
32+ PreferFirst -> pure relA
33+ PreferSecond -> pure relB
34+ PreferNeither -> throwError mergeErr
35+ handler AttributeNamesMismatchError{} = preferredRelVar
36+ handler _err' = throwError mergeErr
37+ --typecheck first?
38+ (evalGraphRefRelationalExpr unioned >> pure (Union relA relB)) `catchError` handler
3739
3840--try to execute unions against the relvars contents -- if a relvar only appears in one context, include it
3941unionMergeRelVars :: MergePreference -> RelationVariables -> RelationVariables -> GraphRefRelationalExprM RelationVariables
@@ -46,11 +48,7 @@ unionMergeRelVars prefer relvarsA relvarsB = do
4648 lookupB = findRel relvarsB
4749 case (lookupA, lookupB) of
4850 (Just relA, Just relB) -> do
49− relA' <- evalGraphRefRelationalExpr relA
50− relB' <- evalGraphRefRelationalExpr relB
51− case unionMergeRelation prefer relA' relB' of
52− Left err -> throwError (MergeTransactionError err)
53− Right _merged -> pure (Union relA relB)
51+ unionMergeRelation prefer relA relB
5452 (Nothing, Just relB) -> pure relB
5553 (Just relA, Nothing) -> pure relA
5654 (Nothing, Nothing) -> error "impossible relvar naming lookup"
test/TransactionGraph/Merge.hs+2−2
@@ -195,8 +195,8 @@ testUnionPreferMergeStrategy = TestCase $ do
195195 Right (discon, _) -> do
196196 let Just rvExpr = M.lookup conflictRelVarName (relationVariables (Discon.concreteDatabaseContext discon))
197197 reEnv = freshGraphRefRelationalExprEnv (Just (Discon.concreteDatabaseContext discon)) graph
198− rvRel <- assertEither $ runGraphRefRelationalExprM reEnv (evalGraphRefRelationalExpr rvExpr)
199− assertEqual "branchB relvar preferred in conflict" branchBRelVar rvRel
198+ let eRvRel = runGraphRefRelationalExprM reEnv (evalGraphRefRelationalExpr rvExpr)
199+ assertEqual "branchB relvar preferred in conflict" (Right branchBRelVar) eRvRel
200200
201201-- try various individual component conflicts and check for merge failure
202202testUnionMergeStrategy :: Test