module Data.Factual.Shared.Filter
(
Field
, Filter(..)
, filtersPair
) where
import Data.List.Utils (join, replace)
type Field = String
data Filter = EqualNum Field Double
| EqualStr Field String
| NotEqualNum Field Double
| NotEqualStr Field String
| InNumList Field [Double]
| InStrList Field [String]
| NotInNumList Field [Double]
| NotInStrList Field [String]
| BeginsWith Field String
| NotBeginsWith Field String
| BeginsWithAny Field [String]
| NotBeginsWithAny Field [String]
| IsBlank Field
| IsNotBlank Field
| GreaterThan Field Double
| GreaterThanOrEqualTo Field Double
| LessThan Field Double
| LessThanOrEqualTo Field Double
| SearchFilter Field String
| And [Filter]
| Or [Filter]
deriving Eq
instance Show Filter where
show (EqualNum field num) = (showStr field) ++ ":" ++ (show num)
show (EqualStr field str) = (showStr field) ++ ":" ++ (showStr str)
show (NotEqualNum field num) = (showStr field) ++ ":{" ++ (show "$neq") ++ ":" ++ (show num) ++ "}"
show (NotEqualStr field str) = (showStr field) ++ ":{" ++ (show "$neq") ++ ":" ++ (showStr str) ++ "}"
show (InNumList field nums) = (showStr field) ++ ":{" ++ (show "$in") ++ ":[" ++ (join "," $ map show nums) ++ "]}"
show (InStrList field strs) = (showStr field) ++ ":{" ++ (show "$in") ++ ":[" ++ (join "," $ map showStr strs) ++ "]}"
show (NotInNumList field nums) = (showStr field) ++ ":{" ++ (show "$nin") ++ ":[" ++ (join "," $ map show nums) ++ "]}"
show (NotInStrList field strs) = (showStr field) ++ ":{" ++ (show "$nin") ++ ":[" ++ (join "," $ map showStr strs) ++ "]}"
show (BeginsWith field str) = (showStr field) ++ ":{" ++ (show "$bw") ++ ":" ++ (showStr str) ++ "}"
show (NotBeginsWith field str) = (showStr field) ++ ":{" ++ (show "$nbw") ++ ":" ++ (showStr str) ++ "}"
show (BeginsWithAny field strs) = (showStr field) ++ ":{" ++ (show "$bwin") ++ ":[" ++ (join "," $ map showStr strs) ++ "]}"
show (NotBeginsWithAny field strs) = (showStr field) ++ ":{" ++ (show "$nbwin") ++ ":[" ++ (join "," $ map showStr strs) ++ "]}"
show (IsBlank field) = (showStr field) ++ ":{\"$blank\":true}"
show (IsNotBlank field) = (showStr field) ++ ":{\"$blank\":false}"
show (GreaterThan field num) = (showStr field) ++ ":{" ++ (show "$gt") ++ ":" ++ (show num) ++ "}"
show (GreaterThanOrEqualTo field num) = (showStr field) ++ ":{" ++ (show "$gte") ++ ":" ++ (show num) ++ "}"
show (LessThan field num) = (showStr field) ++ ":{" ++ (show "$lt") ++ ":" ++ (show num) ++ "}"
show (LessThanOrEqualTo field num) = (showStr field) ++ ":{" ++ (show "$lte") ++ ":" ++ (show num) ++ "}"
show (SearchFilter field str) = (showStr field) ++ ":{" ++ (show "$search") ++ ":" ++ (showStr str) ++ "}"
show (And filters) = (show "$and") ++ ":[" ++ (join "," $ map showFilter filters) ++ "]"
show (Or filters) = (show "$or") ++ ":[" ++ (join "," $ map showFilter filters) ++ "]"
showFilter :: Filter -> String
showFilter filter = "{" ++ (show filter) ++ "}"
showStr :: String -> String
showStr str = "\"" ++ replace "\"" "\\\"" str ++ "\""
filtersPair :: [Filter] -> (String, String)
filtersPair [] = ("filters", "")
filtersPair fs = ("filters", "{" ++ (join "," $ map show fs) ++ "}")