@@ -33,8 +33,9 @@ import Data.List as DL
3333import PGQueue.Web as Web
3434import Data.Time.Convenience as Time
3535import qualified Data.Text as T
36−import Data.Ord (comparing)
36+import Data.Ord (comparing, Down(..))
3737import Data.Maybe (fromMaybe)
38+import qualified Data.HashMap.Strict as HM
3839
3940main :: IO ()
4041main = do
@@ -363,7 +364,7 @@ genFilter t = do
363364 updatedBefore <- case updatedAfter of
364365 Nothing -> Gen.maybe (anyTimeGen t)
365366 Just x -> Gen.maybe (futureTimeGen x)
366− orderClause <- Gen.maybe ((,) <$> (Gen.element [Web.OrdCreatedAt, Web.OrdUpdatedAt, Web.OrdLockedAt, Web.OrdStatus]) <*> (Gen.element $ enumFrom Web.Asc))
367+ orderClause <- Gen.maybe ((,) <$> (Gen.element $ enumFrom Web.OrdCreatedAt) <*> (Gen.element $ enumFrom Web.Asc))
367368 pure Web.blankFilter
368369 { filterStatuses = statuses
369370 , filterCreatedAfter = createdAfter
@@ -373,6 +374,13 @@ genFilter t = do
373374 , filterOrder = orderClause
374375 }
375376
377+jobType :: Job -> T.Text
378+jobType Job{jobPayload} = case jobPayload of
379+ Aeson.Object hm -> case HM.lookup "tag" hm of
380+ Just (Aeson.String t) -> t
381+ _ -> ""
382+ _ -> ""
383+
376384filterJobs :: Filter -> [Job] -> [Job]
377385filterJobs Web.Filter{filterStatuses, filterCreatedAfter, filterCreatedBefore, filterUpdatedAfter, filterUpdatedBefore, filterOrder} js =
378386 applyOrdering (fromMaybe (Web.OrdUpdatedAt, Web.Desc) filterOrder) $
@@ -383,16 +391,21 @@ filterJobs Web.Filter{filterStatuses, filterCreatedAfter, filterCreatedBefore, f
383391 (filterByUpdatedBefore j)
384392 where
385393 applyOrdering (fld, dir) lst =
386− let comparer = case fld of
387− Web.OrdCreatedAt -> comparing jobCreatedAt
388− Web.OrdUpdatedAt -> comparing jobUpdatedAt
389− Web.OrdLockedAt -> comparing jobLockedAt
390− Web.OrdStatus -> comparing jobStatus
391− Web.OrdJobType -> Prelude.error "not implemented" -- comparing (\j -> jobPayload
392− resultOrder = case dir of
393− Web.Asc -> Prelude.id
394− Web.Desc -> Prelude.reverse
395− in resultOrder $ sortBy comparer lst
394+ let comparer = resultOrder $ case fld of
395+ Web.OrdCreatedAt -> (comparing jobCreatedAt)
396+ Web.OrdUpdatedAt -> (comparing jobUpdatedAt)
397+ Web.OrdLockedAt -> (comparing jobLockedAt)
398+ Web.OrdStatus -> (comparing jobStatus)
399+ Web.OrdJobType -> comparing jobType
400+ resultOrder fn = \x y -> case fn x y of
401+ EQ -> compare (Down $ jobId x) (Down $ jobId y)
402+ LT -> case dir of
403+ Web.Asc -> LT
404+ Web.Desc -> GT
405+ GT -> case dir of
406+ Web.Asc -> GT
407+ Web.Desc -> LT
408+ in sortBy comparer lst
396409
397410 filterByStatus Job.Job{jobStatus} = if Prelude.null filterStatuses
398411 then True