@@ -70,6 +70,8 @@ module Database.Bloodhound.Types
70 , OptimizeBbox(..)
70 , OptimizeBbox(..)
71 , LatLon(..)
71 , LatLon(..)
72 , Range(..)
72 , Range(..)
73 , HalfRange(..)
75 , HalfRange(..)
74 , RangeExecution(..)
76 , RangeExecution(..)
75 , LessThan(..)
77 , LessThan(..)
@@ -922,6 +924,8 @@ data Filter = AndFilter [Filter] Cache
922 | MissingFilter FieldName Existence NullValue
924 | MissingFilter FieldName Existence NullValue
923 | PrefixFilter FieldName PrefixValue Cache
925 | PrefixFilter FieldName PrefixValue Cache
924 | RangeFilter FieldName (Either HalfRange Range) RangeExecution Cache
926 | RangeFilter FieldName (Either HalfRange Range) RangeExecution Cache
927+ | RangeFilterText FieldName RangeText RangeExecution Cache
928+ | RangeFilterDouble FieldName RangeDouble RangeExecution Cache
925 | RegexpFilter FieldName Regexp RegexpFlags CacheName Cache CacheKey
929 | RegexpFilter FieldName Regexp RegexpFlags CacheName Cache CacheKey
926 | TermFilter Term Cache
930 | TermFilter Term Cache
927 deriving (Eq, Show)
931 deriving (Eq, Show)
@@ -975,6 +979,28 @@ rangeToKV (RangeLteGte (LessThanEq m) (GreaterThanEq n)) = ("lte", m, "gte", n)
976-- phew. Coulda used Agda style case breaking there but, you know, whatever. :)
980-- phew. Coulda used Agda style case breaking there but, you know, whatever. :)
982+-- Different, subjectively saner ranges.
984+data RangeText = RangeTextLte Text
988+ | RangeTextGtLt Text Text
989+ | RangeTextGteLte Text Text
990+ | RangeTextGteLt Text Text
991+ | RangeTextGtLte Text Text
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)
978data Term = Term { termField :: Text
1004data Term = Term { termField :: Text
979 , termValue :: Text } deriving (Eq, Show)
1005 , termValue :: Text } deriving (Eq, Show)
@@ -1356,6 +1382,36 @@ instance ToJSON Filter where
1357 (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1383 (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1385+ toJSON (RangeFilterText (FieldName fieldName) rangeSpec rangeExecution cache) =
1387+ object [ fieldName .= object (rangeObject rangeSpec)
1388+ , "execution" .= toJSON rangeExecution
1389+ , "_cache" .= cache]]
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]
1400+ toJSON (RangeFilterDouble (FieldName fieldName) rangeSpec rangeExecution cache) =
1402+ object [ fieldName .= object (rangeObject rangeSpec)
1403+ , "execution" .= toJSON rangeExecution
1404+ , "_cache" .= cache]]
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) = ["lte" .= l, "gte" .= g]
1411+ rangeObject (RangeDoubleGtLte l g) = ["lt" .= l, "gte" .= g]
1412+ rangeObject (RangeDoubleGteLt l g) = ["lte" .= l, "gt" .= g]
1413+ rangeObject (RangeDoubleGtLt l g) = ["lt" .= l, "gt" .= g]
1359 toJSON (RegexpFilter (FieldName fieldName)
1415 toJSON (RegexpFilter (FieldName fieldName)
1360 (Regexp regexText) flags (CacheName cacheName) cache (CacheKey cacheKey)) =
1416 (Regexp regexText) flags (CacheName cacheName) cache (CacheKey cacheKey)) =
1361 object ["regexp" .=
1417 object ["regexp" .=