on master help sign in
implemented filterOrder
commit7534a77fbf8a6e68a420123ed3914e9e45cce939 authorSaurabh Nanda <saurabh@vacationlabs.com> dateMon 5 Aug 2019, 00:56 (7 years ago) parented96297
4 files changed+44−14
package.yaml+1 src/PGQueue/Job.hs+4−1 src/PGQueue/Web.hs+14−1 test/Test.hs+25−12
package.yaml+1
@@ -83,3 +83,4 @@ tests:
8383 - lifted-base
8484 - lifted-async
8585 - containers
86+ - unordered-containers
src/PGQueue/Job.hs+4−1
@@ -154,7 +154,10 @@ data Status = Success
154154 | Queued
155155 | Failed
156156 | Retry
157− deriving (Eq, Show, Generic, Enum, Ord)
157+ deriving (Eq, Show, Generic, Enum)
158+
159+instance Ord Status where
160+ compare x y = compare (toText x) (toText y)
158161
159162data Job = Job
160163 { jobId :: JobId
src/PGQueue/Web.hs+14−1
@@ -12,6 +12,7 @@ import Database.PostgreSQL.Simple.ToRow as PGS
1212import Database.PostgreSQL.Simple.ToField as PGS
1313import Data.Pool as Pool
1414import UnliftIO
15+import Data.Maybe
1516
1617data OrderDirection = Asc | Desc deriving (Eq, Show, Generic, Enum)
1718
@@ -74,10 +75,22 @@ data WrappedToRow = forall a . ToRow a => WrappedToRow a
7475
7576filterJobsQuery :: TableName -> Filter -> (PGS.Query, [Action])
7677filterJobsQuery tname Filter{filterStatuses, filterCreatedBefore, filterCreatedAfter, filterUpdatedBefore, filterUpdatedAfter, filterJobTypes, filterOrder} =
77− ( "SELECT " <> Job.concatJobDbColumns <> " FROM " <> tname <> whereClause -- <> " ORDER BY " <> orderClause
78+ ( "SELECT " <> Job.concatJobDbColumns <> " FROM " <> tname <> whereClause <> " " <> (orderClause $ fromMaybe (OrdUpdatedAt, Desc) filterOrder)
7879 , whereActions
7980 )
8081 where
82+ orderClause (flt, dir) =
83+ let fname = case flt of
84+ OrdCreatedAt -> "created_at"
85+ OrdUpdatedAt -> "updated_at"
86+ OrdLockedAt -> "locked_at"
87+ OrdStatus -> "status"
88+ OrdJobType -> "payload->>'tag'"
89+ dname = case dir of
90+ Asc -> "asc nulls first"
91+ Desc -> "desc nulls last"
92+ in "ORDER BY " <> fname <> " " <> dname <> ", id desc"
93+
8194
8295 (whereClause, whereActions) = case statusClause `and` createdAfterClause `and` createdBeforeClause `and` updatedBeforeClause `and` updatedAfterClause `and` jobTypeClause of
8396 Nothing -> (mempty, toRow ())
test/Test.hs+25−12
@@ -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