{- | Module : Database.SQLDeps.Diff Copyright : Copyright (C) 2013 Alexander Thiemann License : BSD3 Maintainer : Alexander Thiemann Stability : provisional Portability: portable Helper module that calcuates which SELECT statements are affected by an UPDATE or INSERT -} module Database.SQLDeps.Diff ( affectedSelects ) where import Database.SQLDeps.Types selectForTable :: TableName -> [Select] -> [Select] selectForTable tbl = filter (\(Select _ tbls _) -> tbl `elem` tbls) selectForTbl :: Upsert -> [Select] -> [Select] selectForTbl (Insert tbl _) = selectForTable tbl selectForTbl (Update tbl _ _) = selectForTable tbl affectsFilter :: (FieldName, FieldVal) -> Filter -> Bool affectsFilter (fName, fVal) f = case f of EqualTo fName' eVal -> (fName == fName' && fVal == eVal) LargerThan fName' eVal -> (fName == fName' && fVal > eVal) SmallerThan fName' eVal -> (fName == fName' && fVal < eVal) doesApply :: [(FieldName, FieldVal)] -> [Filter] -> Bool doesApply vals filters = or $ concatMap (\v -> map (affectsFilter v) filters) vals doesAffect :: Upsert -> Select -> Bool doesAffect (Insert _ vals) (Select _ _ filters) = doesApply vals filters doesAffect (Update _ vals filters) (Select _ _ filters') = doesApply vals allF where allF = filters ++ filters' affectedSelects :: Upsert -> [Select] -> [Select] affectedSelects up sels = foldl (\s cur -> if doesAffect up cur then (cur : s) else s ) [] tbl where tbl = selectForTbl up sels