git.iko.soy/typeable/bloodhound
on master help sign in
add Double/Text typed ranges
c9b44e7Alex K
src/Database/Bloodhound/Types.hs+56
@@ -70,6 +70,8 @@ module Database.Bloodhound.Types
70 , OptimizeBbox(..)
70 , OptimizeBbox(..)
71 , LatLon(..)
71 , LatLon(..)
72 , Range(..)
72 , Range(..)
73+ , RangeDouble(..)
74+ , RangeText(..)
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)
975
979
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. :)
977
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)
1003+
978data Term = Term { termField :: Text
1004data Term = Term { termField :: Text
979 , termValue :: Text } deriving (Eq, Show)
1005 , termValue :: Text } deriving (Eq, Show)
980
1006
@@ -1356,6 +1382,36 @@ instance ToJSON Filter where
1356 where
1382 where
1357 (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1383 (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
1358
1384
1385+ toJSON (RangeFilterText (FieldName fieldName) rangeSpec rangeExecution cache) =
1386+ object ["range" .=
1387+ object [ fieldName .= object (rangeObject rangeSpec)
1388+ , "execution" .= toJSON rangeExecution
1389+ , "_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) = ["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]
1414+
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" .=
tests/tests.hs+9
@@ -441,6 +441,15 @@ main = hspec $ do
441 myTweet <- searchTweet search
441 myTweet <- searchTweet search
442 myTweet `shouldBe` Right exampleTweet
442 myTweet `shouldBe` Right exampleTweet
443
443
444+ it "returns document for range double filter" $ do
445+ _ <- insertData
446+ let filter = RangeFilterDouble (FieldName "age")
447+ (RangeDoubleGtLt 100000.0 1000.0)
448+ RangeExecutionIndex False
449+ let search = mkSearch Nothing (Just filter)
450+ myTweet <- searchTweet search
451+ myTweet `shouldBe` Right exampleTweet
452+
444 it "returns document for regexp filter" $ do
453 it "returns document for regexp filter" $ do
445 _ <- insertData
454 _ <- insertData
446 let filter = RegexpFilter (FieldName "user") (Regexp "bite.*app")
455 let filter = RegexpFilter (FieldName "user") (Regexp "bite.*app")