@@ -24,9 +24,7 @@
2424module Database.Bloodhound.Types
2525 ( defaultCache
2626 , defaultIndexSettings
27− , halfRangeToKV
2827 , mkSort
29− , rangeToKV
3028 , showText
3129 , unpackId
3230 , mkMatchQuery
@@ -69,10 +67,7 @@ module Database.Bloodhound.Types
6967 , DistanceRange(..)
7068 , OptimizeBbox(..)
7169 , LatLon(..)
72− , Range(..)
73− , RangeDouble(..)
74− , RangeText(..)
75− , HalfRange(..)
70+ , RangeValue(..)
7671 , RangeExecution(..)
7772 , LessThan(..)
7873 , LessThanEq(..)
@@ -637,10 +632,10 @@ data RegexpQuery =
637632
638633data RangeQuery =
639634 RangeQuery { rangeQueryField :: FieldName
640− , rangeQueryRange :: Either HalfRange Range
635+ , rangeQueryRange :: RangeValue
641636 , rangeQueryBoost :: Boost } deriving (Eq, Show)
642637
643−mkRangeQuery :: FieldName -> Either HalfRange Range -> RangeQuery
638+mkRangeQuery :: FieldName -> RangeValue -> RangeQuery
644639mkRangeQuery f r = RangeQuery f r (Boost 1.0)
645640
646641data SimpleQueryStringQuery =
@@ -923,9 +918,7 @@ data Filter = AndFilter [Filter] Cache
923918 | LimitFilter Int
924919 | MissingFilter FieldName Existence NullValue
925920 | PrefixFilter FieldName PrefixValue Cache
926− | RangeFilter FieldName (Either HalfRange Range) RangeExecution Cache
927− | RangeFilterText FieldName RangeText RangeExecution Cache
928− | RangeFilterDouble FieldName RangeDouble RangeExecution Cache
921+ | RangeFilter FieldName RangeValue RangeExecution Cache
929922 | RegexpFilter FieldName Regexp RegexpFlags CacheName Cache CacheKey
930923 | TermFilter Term Cache
931924 deriving (Eq, Show)
@@ -933,22 +926,6 @@ data Filter = AndFilter [Filter] Cache
933926data ZeroTermsQuery = ZeroTermsNone
934927 | ZeroTermsAll deriving (Eq, Show)
935928
936−-- lt, lte | gt, gte
937−newtype LessThan = LessThan Double deriving (Eq, Show)
938−newtype LessThanEq = LessThanEq Double deriving (Eq, Show)
939−newtype GreaterThan = GreaterThan Double deriving (Eq, Show)
940−newtype GreaterThanEq = GreaterThanEq Double deriving (Eq, Show)
941−
942−data HalfRange = HalfRangeLt LessThan
943− | HalfRangeLte LessThanEq
944− | HalfRangeGt GreaterThan
945− | HalfRangeGte GreaterThanEq deriving (Eq, Show)
946−
947−data Range = RangeLtGt LessThan GreaterThan
948− | RangeLtGte LessThan GreaterThanEq
949− | RangeLteGt LessThanEq GreaterThan
950− | RangeLteGte LessThanEq GreaterThanEq deriving (Eq, Show)
951−
952929data RangeExecution = RangeExecutionIndex
953930 | RangeExecutionFielddata deriving (Eq, Show)
954931
@@ -965,41 +942,42 @@ data RegexpFlag = AnyString
965942 | Intersection
966943 | Interval deriving (Eq, Show)
967944
968−halfRangeToKV :: HalfRange -> (Text, Double)
969−halfRangeToKV (HalfRangeLt (LessThan n)) = ("lt", n)
970−halfRangeToKV (HalfRangeLte (LessThanEq n)) = ("lte", n)
971−halfRangeToKV (HalfRangeGt (GreaterThan n)) = ("gt", n)
972−halfRangeToKV (HalfRangeGte (GreaterThanEq n)) = ("gte", n)
973−
974−rangeToKV :: Range -> (Text, Double, Text, Double)
975−rangeToKV (RangeLtGt (LessThan m) (GreaterThan n)) = ("lt", m, "gt", n)
976−rangeToKV (RangeLtGte (LessThan m) (GreaterThanEq n)) = ("lt", m, "gte", n)
977−rangeToKV (RangeLteGt (LessThanEq m) (GreaterThan n)) = ("lte", m, "gt", n)
978−rangeToKV (RangeLteGte (LessThanEq m) (GreaterThanEq n)) = ("lte", m, "gte", n)
979−
980−-- phew. Coulda used Agda style case breaking there but, you know, whatever. :)
981−
982−-- Different, subjectively saner ranges.
983−
984−data RangeText = RangeTextLte Text
985− | RangeTextLt Text
986− | RangeTextGte Text
987− | RangeTextGt Text
988− | RangeTextGtLt Text Text
989− | RangeTextGteLte Text Text
990− | RangeTextGteLt Text Text
991− | RangeTextGtLte Text Text
992− deriving (Eq, Show)
993−
994−data RangeDouble = RangeDoubleLte Double
995− | RangeDoubleLt Double
996− | RangeDoubleGte Double
997− | RangeDoubleGt Double
998− | RangeDoubleGtLt Double Double
999− | RangeDoubleGteLte Double Double
1000− | RangeDoubleGteLt Double Double
1001− | RangeDoubleGtLte Double Double
1002− deriving (Eq, Show)
945+data RangeValue = RangeDateLte UTCTime
946+ | RangeDateLt UTCTime
947+ | RangeDateGte UTCTime
948+ | RangeDateGt UTCTime
949+ | RangeDateGtLt UTCTime UTCTime
950+ | RangeDateGteLte UTCTime UTCTime
951+ | RangeDateGteLt UTCTime UTCTime
952+ | RangeDateGtLte UTCTime UTCTime
953+ | RangeDoubleLte Double
954+ | RangeDoubleLt Double
955+ | RangeDoubleGte Double
956+ | RangeDoubleGt Double
957+ | RangeDoubleGtLt Double Double
958+ | RangeDoubleGteLte Double Double
959+ | RangeDoubleGteLt Double Double
960+ | RangeDoubleGtLte Double Double
961+ deriving (Eq, Show)
962+
963+rangeValueToPair :: RangeValue -> [Pair]
964+rangeValueToPair rv = case rv of
965+ RangeDateLte t -> ["lte" .= t]
966+ RangeDateGte t -> ["gte" .= t]
967+ RangeDateLt t -> ["lt" .= t]
968+ RangeDateGt t -> ["gt" .= t]
969+ RangeDateGteLte l g -> ["gte" .= l, "lte" .= g]
970+ RangeDateGtLte l g -> ["gt" .= l, "lte" .= g]
971+ RangeDateGteLt l g -> ["gte" .= l, "lt" .= g]
972+ RangeDateGtLt l g -> ["gt" .= l, "lt" .= g]
973+ RangeDoubleLte t -> ["lte" .= t]
974+ RangeDoubleGte t -> ["gte" .= t]
975+ RangeDoubleLt t -> ["lt" .= t]
976+ RangeDoubleGt t -> ["gt" .= t]
977+ RangeDoubleGteLte l g -> ["gte" .= l, "lte" .= g]
978+ RangeDoubleGtLte l g -> ["gt" .= l, "lte" .= g]
979+ RangeDoubleGteLt l g -> ["gte" .= l, "lt" .= g]
980+ RangeDoubleGtLt l g -> ["gt" .= l, "lt" .= g]
1003981
1004982data Term = Term { termField :: Text
1005983 , termValue :: Text } deriving (Eq, Show)
@@ -1363,54 +1341,11 @@ instance ToJSON Filter where
13631341 object [fieldName .= fieldValue
13641342 , "_cache" .= cache]]
13651343
1366− toJSON (RangeFilter (FieldName fieldName) (Left halfRange) rangeExecution cache) =
1367− object ["range" .=
1368− object [fieldName .=
1369− object [rqFKey .= rqFVal]
1370− , "execution" .= toJSON rangeExecution
1371− , "_cache" .= cache]]
1372− where
1373− (rqFKey, rqFVal) = halfRangeToKV halfRange
1374−
1375− toJSON (RangeFilter (FieldName fieldName) (Right range) rangeExecution cache) =
1376− object ["range" .=
1377− object [fieldName .=
1378− object [lessKey .= lessVal
1379− , greaterKey .= greaterVal]
1380− , "execution" .= toJSON rangeExecution
1381− , "_cache" .= cache]]
1382− where
1383− (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1384−
1385− toJSON (RangeFilterText (FieldName fieldName) rangeSpec rangeExecution cache) =
1344+ toJSON (RangeFilter (FieldName fieldName) rangeValue rangeExecution cache) =
13861345 object ["range" .=
1387− object [ fieldName .= object (rangeObject rangeSpec)
1346+ object [ fieldName .= object (rangeValueToPair rangeValue)
13881347 , "execution" .= toJSON rangeExecution
13891348 , "_cache" .= cache]]
1390− where
1391− rangeObject (RangeTextLte t) = ["lte" .= t]
1392− rangeObject (RangeTextGte t) = ["gte" .= t]
1393− rangeObject (RangeTextLt t) = ["lt" .= t]
1394− rangeObject (RangeTextGt t) = ["gt" .= t]
1395− rangeObject (RangeTextGteLte l g) = ["gte" .= l, "lte" .= g]
1396− rangeObject (RangeTextGtLte l g) = ["gt" .= l, "lte" .= g]
1397− rangeObject (RangeTextGteLt l g) = ["gte" .= l, "lt" .= g]
1398− rangeObject (RangeTextGtLt l g) = ["gt" .= l, "lt" .= g]
1399−
1400− toJSON (RangeFilterDouble (FieldName fieldName) rangeSpec rangeExecution cache) =
1401− object ["range" .=
1402− object [ fieldName .= object (rangeObject rangeSpec)
1403− , "execution" .= toJSON rangeExecution
1404− , "_cache" .= cache]]
1405− where
1406− rangeObject (RangeDoubleLte t) = ["lte" .= t]
1407− rangeObject (RangeDoubleGte t) = ["gte" .= t]
1408− rangeObject (RangeDoubleLt t) = ["lt" .= t]
1409− rangeObject (RangeDoubleGt t) = ["gt" .= t]
1410− rangeObject (RangeDoubleGteLte l g) = ["gte" .= l, "lte" .= g]
1411− rangeObject (RangeDoubleGtLte l g) = ["gt" .= l, "lte" .= g]
1412− rangeObject (RangeDoubleGteLt l g) = ["gte" .= l, "lt" .= g]
1413− rangeObject (RangeDoubleGtLt l g) = ["gt" .= l, "lt" .= g]
14141349
14151350 toJSON (RegexpFilter (FieldName fieldName)
14161351 (Regexp regexText) flags (CacheName cacheName) cache (CacheKey cacheKey)) =
@@ -1604,18 +1539,9 @@ instance ToJSON QueryStringQuery where
16041539
16051540
16061541instance ToJSON RangeQuery where
1607− toJSON (RangeQuery (FieldName fieldName) (Right range) boost) =
1608− object [ fieldName .= conjoined ]
1609− where conjoined = [ "boost" .= toJSON boost
1610− , lessKey .= lessVal
1611− , greaterKey .= greaterVal ]
1612− (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1613−
1614− toJSON (RangeQuery (FieldName fieldName) (Left halfRange) boost) =
1542+ toJSON (RangeQuery (FieldName fieldName) range boost) =
16151543 object [ fieldName .= conjoined ]
1616− where conjoined = [ "boost" .= toJSON boost
1617− , rqKey .= rqVal ]
1618− (rqKey, rqVal) = halfRangeToKV halfRange
1544+ where conjoined = [ "boost" .= toJSON boost ] ++ (rangeValueToPair range)
16191545
16201546
16211547instance ToJSON PrefixQuery where