@@ -38,6 +38,13 @@ module Database.Bloodhound.Client
38 , DistanceRange(..)
38 , DistanceRange(..)
39 , OptimizeBbox(..)
39 , OptimizeBbox(..)
40 , LatLon(..)
40 , LatLon(..)
@@ -366,8 +373,13 @@ type FieldName = Text
366type Cache = Bool -- caching on/off
373type Cache = Bool -- caching on/off
367defaultCache = False
374defaultCache = False
376+type Existence = Bool
377+type NullValue = Bool
378+type PrefixValue = Text
369data Filter = AndFilter [Filter] Cache
380data Filter = AndFilter [Filter] Cache
370− | OrFilter [Filter] Cache
381+ | OrFilter [Filter] Cache
382+ | NotFilter Filter Cache
371 | IdentityFilter
383 | IdentityFilter
372 | BoolFilter BoolMatch
384 | BoolFilter BoolMatch
373 | ExistsFilter FieldName -- always cached
385 | ExistsFilter FieldName -- always cached
@@ -376,6 +388,10 @@ data Filter = AndFilter [Filter] Cache
376 | GeoDistanceRangeFilter GeoPoint DistanceRange
388 | GeoDistanceRangeFilter GeoPoint DistanceRange
377 | GeoPolygonFilter FieldName [LatLon]
389 | GeoPolygonFilter FieldName [LatLon]
378 | IdsFilter MappingName [DocumentID]
390 | IdsFilter MappingName [DocumentID]
392+ | MissingFilter FieldName Existence NullValue
393+ | PrefixFilter FieldName PrefixValue Cache
394+ | RangeFilter FieldName (Either HalfRange Range) RangeExecution Cache
379 deriving (Eq, Show)
395 deriving (Eq, Show)
381class Monoid a => Seminearring a where
397class Monoid a => Seminearring a where
@@ -403,6 +419,11 @@ instance ToJSON Filter where
403 object ["or" .= fmap toJSON filters
419 object ["or" .= fmap toJSON filters
404 , "_cache" .= cache]
420 , "_cache" .= cache]
422+ toJSON (NotFilter filter cache) =
424+ object ["filter" .= toJSON filter
425+ , "_cache" .= cache]]
406 toJSON (IdentityFilter) =
427 toJSON (IdentityFilter) =
407 object ["match_all" .= object []]
428 object ["match_all" .= object []]
@@ -443,6 +464,39 @@ instance ToJSON Filter where
443 object ["type" .= mappingName
464 object ["type" .= mappingName
444 , "values" .= fmap T.pack values]]
465 , "values" .= fmap T.pack values]]
467+ toJSON (LimitFilter limit) =
468+ object ["limit" .= object ["value" .= limit]]
470+ toJSON (MissingFilter fieldName existence nullValue) =
471+ object ["missing" .=
472+ object ["field" .= fieldName
473+ , "existence" .= existence
474+ , "null_value" .= nullValue]]
476+ toJSON (PrefixFilter fieldName fieldValue cache) =
478+ object [fieldName .= fieldValue
479+ , "_cache" .= cache]]
481+ toJSON (RangeFilter fieldName (Left halfRange) rangeExecution cache) =
483+ object [fieldName .=
485+ , "execution" .= toJSON rangeExecution
486+ , "_cache" .= cache]]
488+ (key, val) = halfRangeToKV halfRange
490+ toJSON (RangeFilter fieldName (Right range) rangeExecution cache) =
492+ object [fieldName .=
493+ object [lessKey .= lessVal
494+ , greaterKey .= greaterVal]
495+ , "execution" .= toJSON rangeExecution
496+ , "_cache" .= cache]]
498+ (lessKey, lessVal, greaterKey, greaterVal) = rangeToKV range
446instance ToJSON GeoPoint where
500instance ToJSON GeoPoint where
447 toJSON (GeoPoint geoField latLon) =
501 toJSON (GeoPoint geoField latLon) =
448 object [geoField .= toJSON latLon]
502 object [geoField .= toJSON latLon]
@@ -496,6 +550,42 @@ instance ToJSON LatLon where
496 object ["lat" .= lat
550 object ["lat" .= lat
497 , "lon" .= lon]
551 , "lon" .= lon]
554+newtype LessThan = LessThan Double deriving (Eq, Show)
555+newtype LessThanEq = LessThanEq Double deriving (Eq, Show)
556+newtype GreaterThan = GreaterThan Double deriving (Eq, Show)
557+newtype GreaterThanEq = GreaterThanEq Double deriving (Eq, Show)
559+data HalfRange = HalfRangeLt LessThan
560+ | HalfRangeLte LessThanEq
561+ | HalfRangeGt GreaterThan
562+ | HalfRangeGte GreaterThanEq deriving (Eq, Show)
564+data Range = RangeLtGt LessThan GreaterThan
565+ | RangeLtGte LessThan GreaterThanEq
566+ | RangeLteGt LessThanEq GreaterThan
567+ | RangeLteGte LessThanEq GreaterThanEq deriving (Eq, Show)
569+halfRangeToKV :: HalfRange -> (Text, Double)
570+halfRangeToKV (HalfRangeLt (LessThan n)) = ("lt", n)
571+halfRangeToKV (HalfRangeLte (LessThanEq n)) = ("lte", n)
572+halfRangeToKV (HalfRangeGt (GreaterThan n)) = ("gt", n)
573+halfRangeToKV (HalfRangeGte (GreaterThanEq n)) = ("gte", n)
575+rangeToKV :: Range -> (Text, Double, Text, Double)
576+rangeToKV (RangeLtGt (LessThan m) (GreaterThan n)) = ("lt", m, "gt", n)
577+rangeToKV (RangeLtGte (LessThan m) (GreaterThanEq n)) = ("lt", m, "gte", n)
578+rangeToKV (RangeLteGt (LessThanEq m) (GreaterThan n)) = ("lte", m, "gt", n)
579+rangeToKV (RangeLteGte (LessThanEq m) (GreaterThanEq n)) = ("lte", m, "gte", n)
581+data RangeExecution = RangeExecutionIndex
582+ | RangeExecutionFielddata deriving (Eq, Show)
584+-- index for smaller ranges, fielddata for longer ranges
585+instance ToJSON RangeExecution where
586+ toJSON RangeExecutionIndex = "index"
587+ toJSON RangeExecutionFielddata = "fielddata"
499data Term = Term { termField :: Text
589data Term = Term { termField :: Text
500 , termValue :: Text } deriving (Eq, Show)
590 , termValue :: Text } deriving (Eq, Show)