@@ -1,6 +1,11 @@
1−{-# LANGUAGE DeriveGeneric #-}
2−{-# LANGUAGE OverloadedStrings #-}
3−{-# LANGUAGE RecordWildCards #-}
1+{-# LANGUAGE DeriveGeneric #-}
2+{-# LANGUAGE FlexibleContexts #-}
3+{-# LANGUAGE FlexibleInstances #-}
4+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
5+{-# LANGUAGE MultiParamTypeClasses #-}
6+{-# LANGUAGE OverloadedStrings #-}
7+{-# LANGUAGE RecordWildCards #-}
8+{-# LANGUAGE UndecidableInstances #-}
49
510-------------------------------------------------------------------------------
611-- |
@@ -39,6 +44,10 @@ module Database.Bloodhound.Types
3944 , toTerms
4045 , toDateHistogram
4146 , omitNulls
47+ , BH
48+ , runBH
49+ , BHEnv(..)
50+ , MonadBH(..)
4251 , Version(..)
4352 , Status(..)
4453 , Existence(..)
@@ -51,6 +60,9 @@ module Database.Bloodhound.Types
5160 , Search(..)
5261 , SearchResult(..)
5362 , SearchHits(..)
63+ , TrackSortScores
64+ , From(..)
65+ , Size(..)
5466 , ShardResult(..)
5567 , Hit(..)
5668 , Filter(..)
@@ -138,6 +150,8 @@ module Database.Bloodhound.Types
138150 , IgnoreTermFrequency(..)
139151 , MaxQueryTerms(..)
140152 , ScoreType(..)
153+ , Score
154+ , Cache
141155 , TypeName(..)
142156 , BoostTerms(..)
143157 , MaxWordLength(..)
@@ -194,13 +208,16 @@ module Database.Bloodhound.Types
194208 ) where
195209
196210import Control.Applicative
211+import Control.Monad.Error
212+import Control.Monad.Reader
213+import Control.Monad.State
214+import Control.Monad.Writer
197215import Data.Aeson
198216import Data.Aeson.Types (Pair, emptyObject, parseMaybe)
199217import qualified Data.ByteString.Lazy.Char8 as L
200218import Data.List (nub)
201−import Data.List.NonEmpty (NonEmpty(..), toList)
219+import Data.List.NonEmpty (NonEmpty (..), toList)
202220import qualified Data.Map.Strict as M
203−import Data.Monoid
204221import Data.Text (Text)
205222import qualified Data.Text as T
206223import Data.Time.Clock (UTCTime)
@@ -222,6 +239,52 @@ import Database.Bloodhound.Types.Class
222239-- defaultIndexSettings is exported by Database.Bloodhound as well
223240-- no trailing slashes in servers, library handles building the path.
224241
242+{-| Common environment for Elasticsearch calls. Connections will be
243+ pipelined according to the provided HTTP connection manager.
244+-}
245+data BHEnv = BHEnv { bhServer :: Server
246+ , bhManager :: Manager
247+ }
248+
249+{-| All API calls to Elasticsearch operate within
250+ MonadBH. The idea is that it can be easily embedded in your
251+ own monad transformer stack. A default instance for a ReaderT and
252+ alias 'BH' is provided for the simple case.
253+-}
254+class (Functor m, Applicative m, MonadIO m) => MonadBH m where
255+ getBHEnv :: m BHEnv
256+
257+newtype BH m a = BH {
258+ unBH :: ReaderT BHEnv m a
259+ } deriving ( Functor
260+ , Applicative
261+ , Monad
262+ , MonadIO
263+ , MonadState s
264+ , MonadWriter w
265+ , MonadError e
266+ , Alternative
267+ , MonadPlus
268+ , MonadFix)
269+
270+instance MonadTrans BH where
271+ lift = BH . lift
272+
273+instance (MonadReader r m) => MonadReader r (BH m) where
274+ ask = lift ask
275+ local f (BH (ReaderT m)) = BH $ ReaderT $ \r ->
276+ local f (m r)
277+
278+instance (Functor m, Applicative m, MonadIO m) => MonadBH (BH m) where
279+ getBHEnv = BH getBHEnv
280+
281+
282+instance (Functor m, Applicative m, MonadIO m) => MonadBH (ReaderT BHEnv m) where
283+ getBHEnv = ask
284+
285+runBH :: BHEnv -> BH m a -> m a
286+runBH e f = runReaderT (unBH f) e
287+
225288{-| 'Version' is embedded in 'Status' -}
226289data Version = Version { number :: Text
227290 , build_hash :: Text
@@ -400,22 +463,22 @@ newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic)
400463
401464{-| 'Server' is used with the client functions to point at the ES instance
402465-}
403−newtype Server = Server String deriving (Eq, Show)
466+newtype Server = Server Text deriving (Eq, Show)
404467
405468{-| 'IndexName' is used to describe which index to query/create/delete
406469-}
407−newtype IndexName = IndexName String deriving (Eq, Generic, Show)
470+newtype IndexName = IndexName Text deriving (Eq, Generic, Show)
408471
409472{-| 'MappingName' is part of mappings which are how ES describes and schematizes
410473 the data in the indices.
411474-}
412−newtype MappingName = MappingName String deriving (Eq, Generic, Show)
475+newtype MappingName = MappingName Text deriving (Eq, Generic, Show)
413476
414477{-| 'DocId' is a generic wrapper value for expressing unique Document IDs.
415478 Can be set by the user or created by ES itself. Often used in client
416479 functions for poking at specific documents.
417480-}
418−newtype DocId = DocId String deriving (Eq, Generic, Show)
481+newtype DocId = DocId Text deriving (Eq, Generic, Show)
419482
420483{-| 'QueryString' is used to wrap query text bodies, be they human written or not.
421484-}
@@ -526,12 +589,12 @@ newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)
526589
527590{-| 'unpackId' is a silly convenience function that gets used once.
528591-}
529−unpackId :: DocId -> String
592+unpackId :: DocId -> Text
530593unpackId (DocId docId) = docId
531594
532595type TrackSortScores = Bool
533−type From = Int
534−type Size = Int
596+newtype From = From Int deriving (Eq, Show, ToJSON)
597+newtype Size = Size Int deriving (Eq, Show, ToJSON)
535598
536599data Search = Search { queryBody :: Maybe Query
537600 , filterBody :: Maybe Filter
@@ -1055,13 +1118,20 @@ data SearchResult a =
10551118 , searchHits :: SearchHits a
10561119 , aggregations :: Maybe AggregationResults } deriving (Eq, Show)
10571120
1058−type Score = Double
1121+type Score = Maybe Double
10591122
10601123data SearchHits a =
10611124 SearchHits { hitsTotal :: Int
10621125 , maxScore :: Score
10631126 , hits :: [Hit a] } deriving (Eq, Show)
10641127
1128+
1129+instance Monoid (SearchHits a) where
1130+ mempty = SearchHits 0 Nothing mempty
1131+ mappend (SearchHits ta ma ha) (SearchHits tb mb hb) =
1132+ SearchHits (ta + tb) (max ma mb) (ha <> hb)
1133+
1134+
10651135data Hit a =
10661136 Hit { hitIndex :: IndexName
10671137 , hitType :: MappingName
@@ -1195,29 +1265,29 @@ instance Show TimeInterval where
11951265instance ToJSON Aggregation where
11961266 toJSON (TermsAgg (TermsAggregation term include exclude order minDocCount size shardSize collectMode executionHint termAggs)) =
11971267 omitNulls ["terms" .= omitNulls [ toJSON' term,
1198− "include" .= toJSON include,
1199− "exclude" .= toJSON exclude,
1200− "order" .= toJSON order,
1201− "min_doc_count" .= toJSON minDocCount,
1202− "size" .= toJSON size,
1203− "shard_size" .= toJSON shardSize,
1204− "collect_mode" .= toJSON collectMode,
1205− "execution_hint" .= toJSON executionHint
1268+ "include" .= include,
1269+ "exclude" .= exclude,
1270+ "order" .= order,
1271+ "min_doc_count" .= minDocCount,
1272+ "size" .= size,
1273+ "shard_size" .= shardSize,
1274+ "collect_mode" .= collectMode,
1275+ "execution_hint" .= executionHint
12061276 ],
1207− "aggs" .= toJSON termAggs ]
1277+ "aggs" .= termAggs ]
12081278 where
1209− toJSON' x = case x of { Left y -> "field" .= toJSON y; Right y -> "script" .= toJSON y }
1279+ toJSON' x = case x of { Left y -> "field" .= y; Right y -> "script" .= y }
12101280
12111281 toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =
1212− omitNulls ["date_histogram" .= omitNulls [ "field" .= toJSON field,
1213− "interval" .= toJSON interval,
1214− "format" .= toJSON format,
1215− "pre_zone" .= toJSON preZone,
1216− "post_zone" .= toJSON postZone,
1217− "pre_offset" .= toJSON preOffset,
1218− "post_offset" .= toJSON postOffset
1282+ omitNulls ["date_histogram" .= omitNulls [ "field" .= field,
1283+ "interval" .= interval,
1284+ "format" .= format,
1285+ "pre_zone" .= preZone,
1286+ "post_zone" .= postZone,
1287+ "pre_offset" .= preOffset,
1288+ "post_offset" .= postOffset
12191289 ],
1220− "aggs" .= toJSON dateHistoAggs ]
1290+ "aggs" .= dateHistoAggs ]
12211291
12221292type AggregationResults = M.Map Text Value
12231293
@@ -1296,7 +1366,7 @@ instance ToJSON Filter where
12961366
12971367 toJSON (NotFilter notFilter cache) =
12981368 object ["not" .=
1299− object ["filter" .= toJSON notFilter
1369+ object ["filter" .= notFilter
13001370 , "_cache" .= cache]]
13011371
13021372 toJSON (IdentityFilter) =
@@ -1312,26 +1382,26 @@ instance ToJSON Filter where
13121382 ["field" .= fieldName]]
13131383
13141384 toJSON (BoolFilter boolMatch) =
1315− object ["bool" .= toJSON boolMatch]
1385+ object ["bool" .= boolMatch]
13161386
13171387 toJSON (GeoBoundingBoxFilter bbConstraint) =
1318− object ["geo_bounding_box" .= toJSON bbConstraint]
1388+ object ["geo_bounding_box" .= bbConstraint]
13191389
13201390 toJSON (GeoDistanceFilter (GeoPoint (FieldName distanceGeoField) geoDistLatLon)
13211391 distance distanceType optimizeBbox cache) =
13221392 object ["geo_distance" .=
1323− object ["distance" .= toJSON distance
1324− , "distance_type" .= toJSON distanceType
1393+ object ["distance" .= distance
1394+ , "distance_type" .= distanceType
13251395 , "optimize_bbox" .= optimizeBbox
1326− , distanceGeoField .= toJSON geoDistLatLon
1396+ , distanceGeoField .= geoDistLatLon
13271397 , "_cache" .= cache]]
13281398
13291399 toJSON (GeoDistanceRangeFilter (GeoPoint (FieldName gddrField) drLatLon)
13301400 (DistanceRange geoDistRangeDistFrom drDistanceTo)) =
13311401 object ["geo_distance_range" .=
1332− object ["from" .= toJSON geoDistRangeDistFrom
1333− , "to" .= toJSON drDistanceTo
1334− , gddrField .= toJSON drLatLon]]
1402+ object ["from" .= geoDistRangeDistFrom
1403+ , "to" .= drDistanceTo
1404+ , gddrField .= drLatLon]]
13351405
13361406 toJSON (GeoPolygonFilter (FieldName geoPolygonFilterField) latLons) =
13371407 object ["geo_polygon" .=
@@ -1341,7 +1411,7 @@ instance ToJSON Filter where
13411411 toJSON (IdsFilter (MappingName mappingName) values) =
13421412 object ["ids" .=
13431413 object ["type" .= mappingName
1344− , "values" .= fmap (T.pack . unpackId) values]]
1414+ , "values" .= fmap unpackId values]]
13451415
13461416 toJSON (LimitFilter limit) =
13471417 object ["limit" .= object ["value" .= limit]]
@@ -1360,7 +1430,7 @@ instance ToJSON Filter where
13601430 toJSON (RangeFilter (FieldName fieldName) rangeValue rangeExecution cache) =
13611431 object ["range" .=
13621432 object [ fieldName .= object (rangeValueToPair rangeValue)
1363− , "execution" .= toJSON rangeExecution
1433+ , "execution" .= rangeExecution
13641434 , "_cache" .= cache]]
13651435
13661436 toJSON (RegexpFilter (FieldName fieldName)
@@ -1368,14 +1438,14 @@ instance ToJSON Filter where
13681438 object ["regexp" .=
13691439 object [fieldName .=
13701440 object ["value" .= regexText
1371− , "flags" .= toJSON flags]
1441+ , "flags" .= flags]
13721442 , "_name" .= cacheName
13731443 , "_cache" .= cache
13741444 , "_cache_key" .= cacheKey]]
13751445
13761446instance ToJSON GeoPoint where
13771447 toJSON (GeoPoint (FieldName geoPointField) geoPointLatLon) =
1378− object [ geoPointField .= toJSON geoPointLatLon ]
1448+ object [ geoPointField .= geoPointLatLon ]
13791449
13801450
13811451instance ToJSON Query where
@@ -1395,82 +1465,82 @@ instance ToJSON Query where
13951465 getTermValue (Term _ v) = v
13961466 toJSON (IdsQuery idsQueryMappingName docIds) =
13971467 object [ "ids" .= object conjoined ]
1398− where conjoined = [ "type" .= toJSON idsQueryMappingName
1468+ where conjoined = [ "type" .= idsQueryMappingName
13991469 , "values" .= fmap toJSON docIds ]
14001470
14011471 toJSON (QueryQueryStringQuery qQueryStringQuery) =
1402− object [ "query_string" .= toJSON qQueryStringQuery ]
1472+ object [ "query_string" .= qQueryStringQuery ]
14031473
14041474 toJSON (QueryMatchQuery matchQuery) =
1405− object [ "match" .= toJSON matchQuery ]
1475+ object [ "match" .= matchQuery ]
14061476
14071477 toJSON (QueryMultiMatchQuery multiMatchQuery) =
14081478 toJSON multiMatchQuery
14091479
14101480 toJSON (QueryBoolQuery boolQuery) =
1411− object [ "bool" .= toJSON boolQuery ]
1481+ object [ "bool" .= boolQuery ]
14121482
14131483 toJSON (QueryBoostingQuery boostingQuery) =
1414− object [ "boosting" .= toJSON boostingQuery ]
1484+ object [ "boosting" .= boostingQuery ]
14151485
14161486 toJSON (QueryCommonTermsQuery commonTermsQuery) =
1417− object [ "common" .= toJSON commonTermsQuery ]
1487+ object [ "common" .= commonTermsQuery ]
14181488
14191489 toJSON (ConstantScoreFilter csFilter boost) =
1420− object [ "constant_score" .= toJSON csFilter
1421− , "boost" .= toJSON boost]
1490+ object [ "constant_score" .= csFilter
1491+ , "boost" .= boost]
14221492
14231493 toJSON (ConstantScoreQuery query boost) =
1424− object [ "constant_score" .= toJSON query
1425− , "boost" .= toJSON boost]
1494+ object [ "constant_score" .= query
1495+ , "boost" .= boost]
14261496
14271497 toJSON (QueryDisMaxQuery disMaxQuery) =
1428− object [ "dis_max" .= toJSON disMaxQuery ]
1498+ object [ "dis_max" .= disMaxQuery ]
14291499
14301500 toJSON (QueryFilteredQuery qFilteredQuery) =
1431− object [ "filtered" .= toJSON qFilteredQuery ]
1501+ object [ "filtered" .= qFilteredQuery ]
14321502
14331503 toJSON (QueryFuzzyLikeThisQuery fuzzyQuery) =
1434− object [ "fuzzy_like_this" .= toJSON fuzzyQuery ]
1504+ object [ "fuzzy_like_this" .= fuzzyQuery ]
14351505
14361506 toJSON (QueryFuzzyLikeFieldQuery fuzzyFieldQuery) =
1437− object [ "fuzzy_like_this_field" .= toJSON fuzzyFieldQuery ]
1507+ object [ "fuzzy_like_this_field" .= fuzzyFieldQuery ]
14381508
14391509 toJSON (QueryFuzzyQuery fuzzyQuery) =
1440− object [ "fuzzy" .= toJSON fuzzyQuery ]
1510+ object [ "fuzzy" .= fuzzyQuery ]
14411511
14421512 toJSON (QueryHasChildQuery childQuery) =
1443− object [ "has_child" .= toJSON childQuery ]
1513+ object [ "has_child" .= childQuery ]
14441514
14451515 toJSON (QueryHasParentQuery parentQuery) =
1446− object [ "has_parent" .= toJSON parentQuery ]
1516+ object [ "has_parent" .= parentQuery ]
14471517
14481518 toJSON (QueryIndicesQuery qIndicesQuery) =
1449− object [ "indices" .= toJSON qIndicesQuery ]
1519+ object [ "indices" .= qIndicesQuery ]
14501520
14511521 toJSON (MatchAllQuery boost) =
14521522 object [ "match_all" .= omitNulls [ "boost" .= boost ] ]
14531523
14541524 toJSON (QueryMoreLikeThisQuery query) =
1455− object [ "more_like_this" .= toJSON query ]
1525+ object [ "more_like_this" .= query ]
14561526
14571527 toJSON (QueryMoreLikeThisFieldQuery query) =
1458− object [ "more_like_this_field" .= toJSON query ]
1528+ object [ "more_like_this_field" .= query ]
14591529
14601530 toJSON (QueryNestedQuery query) =
1461− object [ "nested" .= toJSON query ]
1531+ object [ "nested" .= query ]
14621532
14631533 toJSON (QueryPrefixQuery query) =
1464− object [ "prefix" .= toJSON query ]
1534+ object [ "prefix" .= query ]
14651535
14661536 toJSON (QueryRangeQuery query) =
1467− object [ "range" .= toJSON query ]
1537+ object [ "range" .= query ]
14681538
14691539 toJSON (QueryRegexpQuery query) =
1470− object [ "regexp" .= toJSON query ]
1540+ object [ "regexp" .= query ]
14711541
14721542 toJSON (QuerySimpleQueryStringQuery query) =
1473− object [ "simple_query_string" .= toJSON query ]
1543+ object [ "simple_query_string" .= query ]
14741544
14751545
14761546omitNulls :: [(Text, Value)] -> Value
@@ -1483,7 +1553,7 @@ omitNulls = object . filter notNull where
14831553instance ToJSON SimpleQueryStringQuery where
14841554 toJSON SimpleQueryStringQuery {..} =
14851555 omitNulls (base ++ maybeAdd)
1486− where base = [ "query" .= toJSON simpleQueryStringQuery ]
1556+ where base = [ "query" .= simpleQueryStringQuery ]
14871557 maybeAdd = [ "fields" .= simpleQueryStringField
14881558 , "default_operator" .= simpleQueryStringOperator
14891559 , "analyzer" .= simpleQueryStringAnalyzer
@@ -1519,7 +1589,7 @@ instance ToJSON RegexpQuery where
15191589 rqQueryBoost) =
15201590 object [ rqQueryField .= omitNulls base ]
15211591 where base = [ "value" .= regexpQueryQuery
1522− , "flags" .= toJSON rqQueryFlags
1592+ , "flags" .= rqQueryFlags
15231593 , "boost" .= rqQueryBoost ]
15241594
15251595
@@ -1535,7 +1605,7 @@ instance ToJSON QueryStringQuery where
15351605 qsLenient qsLocale) =
15361606 omitNulls base
15371607 where
1538− base = [ "query" .= toJSON qsQueryString
1608+ base = [ "query" .= qsQueryString
15391609 , "default_field" .= qsDefaultField
15401610 , "default_operator" .= qsOperator
15411611 , "analyzer" .= qsAnalyzer
@@ -1557,21 +1627,21 @@ instance ToJSON QueryStringQuery where
15571627instance ToJSON RangeQuery where
15581628 toJSON (RangeQuery (FieldName fieldName) range boost) =
15591629 object [ fieldName .= conjoined ]
1560− where conjoined = [ "boost" .= toJSON boost ] ++ (rangeValueToPair range)
1630+ where conjoined = [ "boost" .= boost ] ++ (rangeValueToPair range)
15611631
15621632
15631633instance ToJSON PrefixQuery where
15641634 toJSON (PrefixQuery (FieldName fieldName) queryValue boost) =
15651635 object [ fieldName .= omitNulls base ]
1566− where base = [ "value" .= toJSON queryValue
1636+ where base = [ "value" .= queryValue
15671637 , "boost" .= boost ]
15681638
15691639
15701640instance ToJSON NestedQuery where
15711641 toJSON (NestedQuery nqPath nqScoreType nqQuery) =
1572− object [ "path" .= toJSON nqPath
1573− , "score_mode" .= toJSON nqScoreType
1574− , "query" .= toJSON nqQuery ]
1642+ object [ "path" .= nqPath
1643+ , "score_mode" .= nqScoreType
1644+ , "query" .= nqQuery ]
15751645
15761646
15771647instance ToJSON MoreLikeThisFieldQuery where
@@ -1579,7 +1649,7 @@ instance ToJSON MoreLikeThisFieldQuery where
15791649 percent mtf mqt stopwords mindf maxdf
15801650 minwl maxwl boostTerms boost analyzer) =
15811651 object [ fieldName .= omitNulls base ]
1582− where base = [ "like_text" .= toJSON text
1652+ where base = [ "like_text" .= text
15831653 , "percent_terms_to_match" .= percent
15841654 , "min_term_freq" .= mtf
15851655 , "max_query_terms" .= mqt
@@ -1598,7 +1668,7 @@ instance ToJSON MoreLikeThisQuery where
15981668 mtf mqt stopwords mindf maxdf
15991669 minwl maxwl boostTerms boost analyzer) =
16001670 omitNulls base
1601− where base = [ "like_text" .= toJSON text
1671+ where base = [ "like_text" .= text
16021672 , "fields" .= fields
16031673 , "percent_terms_to_match" .= percent
16041674 , "min_term_freq" .= mtf
@@ -1615,34 +1685,34 @@ instance ToJSON MoreLikeThisQuery where
16151685
16161686instance ToJSON IndicesQuery where
16171687 toJSON (IndicesQuery indices query noMatch) =
1618− omitNulls [ "indices" .= toJSON indices
1619− , "no_match_query" .= toJSON noMatch
1620− , "query" .= toJSON query ]
1688+ omitNulls [ "indices" .= indices
1689+ , "no_match_query" .= noMatch
1690+ , "query" .= query ]
16211691
16221692
16231693instance ToJSON HasParentQuery where
16241694 toJSON (HasParentQuery queryType query scoreType) =
1625− omitNulls [ "parent_type" .= toJSON queryType
1626− , "score_type" .= toJSON scoreType
1627− , "query" .= toJSON query ]
1695+ omitNulls [ "parent_type" .= queryType
1696+ , "score_type" .= scoreType
1697+ , "query" .= query ]
16281698
16291699
16301700instance ToJSON HasChildQuery where
16311701 toJSON (HasChildQuery queryType query scoreType) =
1632− omitNulls [ "query" .= toJSON query
1633− , "score_type" .= toJSON scoreType
1634− , "type" .= toJSON queryType ]
1702+ omitNulls [ "query" .= query
1703+ , "score_type" .= scoreType
1704+ , "type" .= queryType ]
16351705
16361706
16371707instance ToJSON FuzzyQuery where
16381708 toJSON (FuzzyQuery (FieldName fieldName) queryText
16391709 prefixLength maxEx fuzziness boost) =
16401710 object [ fieldName .= omitNulls base ]
1641− where base = [ "value" .= toJSON queryText
1642− , "fuzziness" .= toJSON fuzziness
1643− , "prefix_length" .= toJSON prefixLength
1644− , "boost" .= toJSON boost
1645− , "max_expansions" .= toJSON maxEx ]
1711+ where base = [ "value" .= queryText
1712+ , "fuzziness" .= fuzziness
1713+ , "prefix_length" .= prefixLength
1714+ , "boost" .= boost
1715+ , "max_expansions" .= maxEx ]
16461716
16471717
16481718instance ToJSON FuzzyLikeFieldQuery where
@@ -1650,41 +1720,41 @@ instance ToJSON FuzzyLikeFieldQuery where
16501720 fieldText maxTerms ignoreFreq fuzziness prefixLength
16511721 boost analyzer) =
16521722 object [ fieldName .=
1653− omitNulls [ "like_text" .= toJSON fieldText
1654− , "max_query_terms" .= toJSON maxTerms
1655− , "ignore_tf" .= toJSON ignoreFreq
1656− , "fuzziness" .= toJSON fuzziness
1657− , "prefix_length" .= toJSON prefixLength
1658− , "analyzer" .= toJSON analyzer
1659− , "boost" .= toJSON boost ]]
1723+ omitNulls [ "like_text" .= fieldText
1724+ , "max_query_terms" .= maxTerms
1725+ , "ignore_tf" .= ignoreFreq
1726+ , "fuzziness" .= fuzziness
1727+ , "prefix_length" .= prefixLength
1728+ , "analyzer" .= analyzer
1729+ , "boost" .= boost ]]
16601730
16611731
16621732instance ToJSON FuzzyLikeThisQuery where
16631733 toJSON (FuzzyLikeThisQuery fields text maxTerms
16641734 ignoreFreq fuzziness prefixLength boost analyzer) =
16651735 omitNulls base
1666− where base = [ "fields" .= toJSON fields
1667− , "like_text" .= toJSON text
1668− , "max_query_terms" .= toJSON maxTerms
1669− , "ignore_tf" .= toJSON ignoreFreq
1670− , "fuzziness" .= toJSON fuzziness
1671− , "prefix_length" .= toJSON prefixLength
1672− , "analyzer" .= toJSON analyzer
1673− , "boost" .= toJSON boost ]
1736+ where base = [ "fields" .= fields
1737+ , "like_text" .= text
1738+ , "max_query_terms" .= maxTerms
1739+ , "ignore_tf" .= ignoreFreq
1740+ , "fuzziness" .= fuzziness
1741+ , "prefix_length" .= prefixLength
1742+ , "analyzer" .= analyzer
1743+ , "boost" .= boost ]
16741744
16751745
16761746instance ToJSON FilteredQuery where
16771747 toJSON (FilteredQuery query fFilter) =
1678− object [ "query" .= toJSON query
1679− , "filter" .= toJSON fFilter ]
1748+ object [ "query" .= query
1749+ , "filter" .= fFilter ]
16801750
16811751
16821752instance ToJSON DisMaxQuery where
16831753 toJSON (DisMaxQuery queries tiebreaker boost) =
16841754 omitNulls base
1685− where base = [ "queries" .= toJSON queries
1686− , "boost" .= toJSON boost
1687− , "tie_breaker" .= toJSON tiebreaker ]
1755+ where base = [ "queries" .= queries
1756+ , "boost" .= boost
1757+ , "tie_breaker" .= tiebreaker ]
16881758
16891759
16901760instance ToJSON CommonTermsQuery where
@@ -1692,38 +1762,38 @@ instance ToJSON CommonTermsQuery where
16921762 (QueryString query) cf lfo hfo msm
16931763 boost analyzer disableCoord) =
16941764 object [fieldName .= omitNulls base ]
1695− where base = [ "query" .= toJSON query
1696− , "cutoff_frequency" .= toJSON cf
1697− , "low_freq_operator" .= toJSON lfo
1698− , "minimum_should_match" .= toJSON msm
1699− , "boost" .= toJSON boost
1700− , "analyzer" .= toJSON analyzer
1701− , "disable_coord" .= toJSON disableCoord
1702− , "high_freq_operator" .= toJSON hfo ]
1765+ where base = [ "query" .= query
1766+ , "cutoff_frequency" .= cf
1767+ , "low_freq_operator" .= lfo
1768+ , "minimum_should_match" .= msm
1769+ , "boost" .= boost
1770+ , "analyzer" .= analyzer
1771+ , "disable_coord" .= disableCoord
1772+ , "high_freq_operator" .= hfo ]
17031773
17041774
17051775instance ToJSON CommonMinimumMatch where
17061776 toJSON (CommonMinimumMatch mm) = toJSON mm
17071777 toJSON (CommonMinimumMatchHighLow (MinimumMatchHighLow lowF highF)) =
1708− object [ "low_freq" .= toJSON lowF
1709− , "high_freq" .= toJSON highF ]
1778+ object [ "low_freq" .= lowF
1779+ , "high_freq" .= highF ]
17101780
17111781instance ToJSON BoostingQuery where
17121782 toJSON (BoostingQuery bqPositiveQuery bqNegativeQuery bqNegativeBoost) =
1713− object [ "positive" .= toJSON bqPositiveQuery
1714− , "negative" .= toJSON bqNegativeQuery
1715− , "negative_boost" .= toJSON bqNegativeBoost ]
1783+ object [ "positive" .= bqPositiveQuery
1784+ , "negative" .= bqNegativeQuery
1785+ , "negative_boost" .= bqNegativeBoost ]
17161786
17171787
17181788instance ToJSON BoolQuery where
17191789 toJSON (BoolQuery mustM notM shouldM bqMin boost disableCoord) =
17201790 omitNulls base
1721− where base = [ "must" .= toJSON mustM
1722− , "must_not" .= toJSON notM
1723− , "should" .= toJSON shouldM
1724− , "minimum_should_match" .= toJSON bqMin
1725− , "boost" .= toJSON boost
1726− , "disable_coord" .= toJSON disableCoord ]
1791+ where base = [ "must" .= mustM
1792+ , "must_not" .= notM
1793+ , "should" .= shouldM
1794+ , "minimum_should_match" .= bqMin
1795+ , "boost" .= boost
1796+ , "disable_coord" .= disableCoord ]
17271797
17281798
17291799instance ToJSON MatchQuery where
@@ -1733,13 +1803,13 @@ instance ToJSON MatchQuery where
17331803 analyzer maxExpansions lenient) =
17341804 object [ fieldName .= omitNulls base ]
17351805 where base = [ "query" .= mqQueryString
1736− , "operator" .= toJSON booleanOperator
1737− , "zero_terms_query" .= toJSON zeroTermsQuery
1738− , "cutoff_frequency" .= toJSON cutoffFrequency
1739− , "type" .= toJSON matchQueryType
1740− , "analyzer" .= toJSON analyzer
1741− , "max_expansions" .= toJSON maxExpansions
1742− , "lenient" .= toJSON lenient ]
1806+ , "operator" .= booleanOperator
1807+ , "zero_terms_query" .= zeroTermsQuery
1808+ , "cutoff_frequency" .= cutoffFrequency
1809+ , "type" .= matchQueryType
1810+ , "analyzer" .= analyzer
1811+ , "max_expansions" .= maxExpansions
1812+ , "lenient" .= lenient ]
17431813
17441814
17451815instance ToJSON MultiMatchQuery where
@@ -1748,14 +1818,14 @@ instance ToJSON MultiMatchQuery where
17481818 object ["multi_match" .= omitNulls base]
17491819 where base = [ "fields" .= fmap toJSON fields
17501820 , "query" .= query
1751− , "operator" .= toJSON boolOp
1752− , "zero_terms_query" .= toJSON ztQ
1753− , "tiebreaker" .= toJSON tb
1754− , "type" .= toJSON mmqt
1755− , "cutoff_frequency" .= toJSON cf
1756− , "analyzer" .= toJSON analyzer
1757− , "max_expansions" .= toJSON maxEx
1758− , "lenient" .= toJSON lenient ]
1821+ , "operator" .= boolOp
1822+ , "zero_terms_query" .= ztQ
1823+ , "tiebreaker" .= tb
1824+ , "type" .= mmqt
1825+ , "cutoff_frequency" .= cf
1826+ , "analyzer" .= analyzer
1827+ , "max_expansions" .= maxEx
1828+ , "lenient" .= lenient ]
17591829
17601830
17611831instance ToJSON MultiMatchQueryType where
@@ -1867,7 +1937,7 @@ instance ToJSON FieldHighlight where
18671937
18681938instance ToJSON Highlights where
18691939 toJSON (Highlights global fields) =
1870− omitNulls (("fields" .= toJSON fields)
1940+ omitNulls (("fields" .= fields)
18711941 : highlightSettingsPairs global)
18721942
18731943instance ToJSON HighlightSettings where
@@ -1945,16 +2015,16 @@ instance ToJSON SortSpec where
19452015 (DefaultSort (FieldName dsSortFieldName) dsSortOrder dsIgnoreUnmapped
19462016 dsSortMode dsMissingSort dsNestedFilter)) =
19472017 object [dsSortFieldName .= omitNulls base] where
1948− base = [ "order" .= toJSON dsSortOrder
2018+ base = [ "order" .= dsSortOrder
19492019 , "ignore_unmapped" .= dsIgnoreUnmapped
19502020 , "mode" .= dsSortMode
19512021 , "missing" .= dsMissingSort
19522022 , "nested_filter" .= dsNestedFilter ]
19532023
19542024 toJSON (GeoDistanceSortSpec gdsSortOrder (GeoPoint (FieldName field) gdsLatLon) units) =
1955− object [ "unit" .= toJSON units
1956− , field .= toJSON gdsLatLon
1957− , "order" .= toJSON gdsSortOrder ]
2025+ object [ "unit" .= units
2026+ , field .= gdsLatLon
2027+ , "order" .= gdsSortOrder ]
19582028
19592029
19602030instance ToJSON SortOrder where
@@ -2016,7 +2086,7 @@ instance ToJSON OptimizeBbox where
20162086instance ToJSON GeoBoundingBoxConstraint where
20172087 toJSON (GeoBoundingBoxConstraint
20182088 (FieldName gbbcGeoBBField) gbbcConstraintBox cache type') =
2019− object [gbbcGeoBBField .= toJSON gbbcConstraintBox
2089+ object [gbbcGeoBBField .= gbbcConstraintBox
20202090 , "_cache" .= cache
20212091 , "type" .= type']
20222092
@@ -2028,8 +2098,8 @@ instance ToJSON GeoFilterType where
20282098
20292099instance ToJSON GeoBoundingBox where
20302100 toJSON (GeoBoundingBox gbbTopLeft gbbBottomRight) =
2031− object ["top_left" .= toJSON gbbTopLeft
2032− , "bottom_right" .= toJSON gbbBottomRight]
2101+ object ["top_left" .= gbbTopLeft
2102+ , "bottom_right" .= gbbBottomRight]
20332103
20342104
20352105instance ToJSON LatLon where
@@ -2062,9 +2132,9 @@ instance ToJSON Term where
20622132
20632133
20642134instance ToJSON BoolMatch where
2065− toJSON (MustMatch term cache) = object ["must" .= toJSON term,
2135+ toJSON (MustMatch term cache) = object ["must" .= term,
20662136 "_cache" .= cache]
2067− toJSON (MustNotMatch term cache) = object ["must_not" .= toJSON term,
2137+ toJSON (MustNotMatch term cache) = object ["must_not" .= term,
20682138 "_cache" .= cache]
20692139 toJSON (ShouldMatch terms cache) = object ["should" .= fmap toJSON terms,
20702140 "_cache" .= cache]