fix: weird sql casting

This commit is contained in:
Gregor Kleen 2020-08-02 13:42:02 +02:00
parent 60be62b63b
commit eb9c6760b9
2 changed files with 28 additions and 4 deletions

View File

@ -17,7 +17,7 @@ module Database.Esqueleto.Utils
, selectExists, selectNotExists
, SqlHashable
, sha256
, maybe, unsafeCoalesce
, maybe, maybeEq, unsafeCoalesce
, bool
, max, min
, SqlProject(..)
@ -242,6 +242,25 @@ maybe onNothing onJust val = E.case_
(onJust $ E.veryUnsafeCoerceSqlExprValue val)
]
(E.else_ onNothing)
infix 4 `maybeEq`
maybeEq :: PersistField a
=> E.SqlExpr (E.Value (Maybe a))
-> E.SqlExpr (E.Value (Maybe a))
-> E.SqlExpr (E.Value Bool)
-- ^ `E.==.` but treat `E.nothing` as identical
maybeEq a b = E.case_
[ E.when_
(E.isNothing a)
E.then_
(E.isNothing b)
, E.when_
(E.isNothing b)
E.then_
false -- (E.isNothing a)
]
(E.else_ $ a E.==. b)
bool :: PersistField a
=> E.SqlExpr (E.Value a)

View File

@ -10,6 +10,7 @@ import Database.Persist.Sql (deleteWhereCount)
import qualified Database.Esqueleto as E
import qualified Database.Esqueleto.Utils as E
import qualified Database.Esqueleto.Internal.Sql as E (unsafeSqlCastAs)
import qualified Data.Conduit.Combinators as C
import qualified Data.Conduit.List as C (mapMaybe)
@ -55,7 +56,9 @@ dispatchJobPruneUnreferencedFiles = JobHandlerAtomic . hoist lift $ do
E.update $ \fileContent -> do
let isReferenced = E.any E.exists . fileReferences $ fileContent E.^. FileContentHash
E.set fileContent [ FileContentUnreferencedSince E.=. E.bool (E.just . E.maybe (E.val now) (E.min $ E.val now) $ fileContent E.^. FileContentUnreferencedSince) E.nothing isReferenced ]
now' = E.unsafeSqlCastAs "TIMESTAMP WITH TIME ZONE" $ E.val now
shouldBe = E.bool (E.just . E.maybe now' (E.min now') $ fileContent E.^. FileContentUnreferencedSince) E.nothing isReferenced
E.set fileContent [ FileContentUnreferencedSince E.=. shouldBe ]
let
getCandidates = E.selectSource . E.from $ \fileContent -> do
@ -71,7 +74,8 @@ dispatchJobPruneUnreferencedFiles = JobHandlerAtomic . hoist lift $ do
.| C.map (view $ _1 . _Value)
.| C.mapM (\fRef -> Sum <$> deleteWhereCount [FileContentHash ==. fRef])
.| C.fold
$logInfoS "PruneUnreferencedFiles" [st|Deleted #{deleted} long-unreferenced files|]
when (deleted > 0) $
$logInfoS "PruneUnreferencedFiles" [st|Deleted #{deleted} long-unreferenced files|]
dispatchJobInjectFiles :: JobHandler UniWorX
@ -100,7 +104,8 @@ dispatchJobInjectFiles = JobHandlerException . maybeT (return ()) $ do
fmap ((, mempty) . Sum) . lift. lift . E.insertSelectCount $
let isReferenced = E.any E.exists $ fileReferences (E.val fRef)
in return $ FileContent E.<# E.val fRef E.<&> E.val content E.<&> E.bool (E.just $ E.val now) E.nothing isReferenced
now' = E.unsafeSqlCastAs "TIMESTAMP WITH TIME ZONE" $ E.val now
in return $ FileContent E.<# E.val fRef E.<&> E.val content E.<&> E.bool (E.just now') E.nothing isReferenced
runAppMinio . maybeT (return ()) . catchIfMaybeT minioIsDoesNotExist $ Minio.removeObject uploadBucket obj
return res