@@ -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
@@ -1195,29 +1258,29 @@ instance Show TimeInterval where
11951258instance ToJSON Aggregation where
11961259 toJSON (TermsAgg (TermsAggregation term include exclude order minDocCount size shardSize collectMode executionHint termAggs)) =
11971260 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
1261+ "include" .= include,
1262+ "exclude" .= exclude,
1263+ "order" .= order,
1264+ "min_doc_count" .= minDocCount,
1265+ "size" .= size,
1266+ "shard_size" .= shardSize,
1267+ "collect_mode" .= collectMode,
1268+ "execution_hint" .= executionHint
12061269 ],
1207− "aggs" .= toJSON termAggs ]
1270+ "aggs" .= termAggs ]
12081271 where
1209− toJSON' x = case x of { Left y -> "field" .= toJSON y; Right y -> "script" .= toJSON y }
1272+ toJSON' x = case x of { Left y -> "field" .= y; Right y -> "script" .= y }
12101273
12111274 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
1275+ omitNulls ["date_histogram" .= omitNulls [ "field" .= field,
1276+ "interval" .= interval,
1277+ "format" .= format,
1278+ "pre_zone" .= preZone,
1279+ "post_zone" .= postZone,
1280+ "pre_offset" .= preOffset,
1281+ "post_offset" .= postOffset
12191282 ],
1220− "aggs" .= toJSON dateHistoAggs ]
1283+ "aggs" .= dateHistoAggs ]
12211284
12221285type AggregationResults = M.Map Text Value
12231286
@@ -1295,7 +1358,7 @@ instance ToJSON Filter where
12951358
12961359 toJSON (NotFilter notFilter cache) =
12971360 object ["not" .=
1298− object ["filter" .= toJSON notFilter
1361+ object ["filter" .= notFilter
12991362 , "_cache" .= cache]]
13001363
13011364 toJSON (IdentityFilter) =
@@ -1311,26 +1374,26 @@ instance ToJSON Filter where
13111374 ["field" .= fieldName]]
13121375
13131376 toJSON (BoolFilter boolMatch) =
1314− object ["bool" .= toJSON boolMatch]
1377+ object ["bool" .= boolMatch]
13151378
13161379 toJSON (GeoBoundingBoxFilter bbConstraint) =
1317− object ["geo_bounding_box" .= toJSON bbConstraint]
1380+ object ["geo_bounding_box" .= bbConstraint]
13181381
13191382 toJSON (GeoDistanceFilter (GeoPoint (FieldName distanceGeoField) geoDistLatLon)
13201383 distance distanceType optimizeBbox cache) =
13211384 object ["geo_distance" .=
1322− object ["distance" .= toJSON distance
1323− , "distance_type" .= toJSON distanceType
1385+ object ["distance" .= distance
1386+ , "distance_type" .= distanceType
13241387 , "optimize_bbox" .= optimizeBbox
1325− , distanceGeoField .= toJSON geoDistLatLon
1388+ , distanceGeoField .= geoDistLatLon
13261389 , "_cache" .= cache]]
13271390
13281391 toJSON (GeoDistanceRangeFilter (GeoPoint (FieldName gddrField) drLatLon)
13291392 (DistanceRange geoDistRangeDistFrom drDistanceTo)) =
13301393 object ["geo_distance_range" .=
1331− object ["from" .= toJSON geoDistRangeDistFrom
1332− , "to" .= toJSON drDistanceTo
1333− , gddrField .= toJSON drLatLon]]
1394+ object ["from" .= geoDistRangeDistFrom
1395+ , "to" .= drDistanceTo
1396+ , gddrField .= drLatLon]]
13341397
13351398 toJSON (GeoPolygonFilter (FieldName geoPolygonFilterField) latLons) =
13361399 object ["geo_polygon" .=
@@ -1340,7 +1403,7 @@ instance ToJSON Filter where
13401403 toJSON (IdsFilter (MappingName mappingName) values) =
13411404 object ["ids" .=
13421405 object ["type" .= mappingName
1343− , "values" .= fmap (T.pack . unpackId) values]]
1406+ , "values" .= fmap unpackId values]]
13441407
13451408 toJSON (LimitFilter limit) =
13461409 object ["limit" .= object ["value" .= limit]]
@@ -1359,7 +1422,7 @@ instance ToJSON Filter where
13591422 toJSON (RangeFilter (FieldName fieldName) rangeValue rangeExecution cache) =
13601423 object ["range" .=
13611424 object [ fieldName .= object (rangeValueToPair rangeValue)
1362− , "execution" .= toJSON rangeExecution
1425+ , "execution" .= rangeExecution
13631426 , "_cache" .= cache]]
13641427
13651428 toJSON (RegexpFilter (FieldName fieldName)
@@ -1367,14 +1430,14 @@ instance ToJSON Filter where
13671430 object ["regexp" .=
13681431 object [fieldName .=
13691432 object ["value" .= regexText
1370− , "flags" .= toJSON flags]
1433+ , "flags" .= flags]
13711434 , "_name" .= cacheName
13721435 , "_cache" .= cache
13731436 , "_cache_key" .= cacheKey]]
13741437
13751438instance ToJSON GeoPoint where
13761439 toJSON (GeoPoint (FieldName geoPointField) geoPointLatLon) =
1377− object [ geoPointField .= toJSON geoPointLatLon ]
1440+ object [ geoPointField .= geoPointLatLon ]
13781441
13791442
13801443instance ToJSON Query where
@@ -1394,82 +1457,82 @@ instance ToJSON Query where
13941457 getTermValue (Term _ v) = v
13951458 toJSON (IdsQuery idsQueryMappingName docIds) =
13961459 object [ "ids" .= object conjoined ]
1397− where conjoined = [ "type" .= toJSON idsQueryMappingName
1460+ where conjoined = [ "type" .= idsQueryMappingName
13981461 , "values" .= fmap toJSON docIds ]
13991462
14001463 toJSON (QueryQueryStringQuery qQueryStringQuery) =
1401− object [ "query_string" .= toJSON qQueryStringQuery ]
1464+ object [ "query_string" .= qQueryStringQuery ]
14021465
14031466 toJSON (QueryMatchQuery matchQuery) =
1404− object [ "match" .= toJSON matchQuery ]
1467+ object [ "match" .= matchQuery ]
14051468
14061469 toJSON (QueryMultiMatchQuery multiMatchQuery) =
14071470 toJSON multiMatchQuery
14081471
14091472 toJSON (QueryBoolQuery boolQuery) =
1410− object [ "bool" .= toJSON boolQuery ]
1473+ object [ "bool" .= boolQuery ]
14111474
14121475 toJSON (QueryBoostingQuery boostingQuery) =
1413− object [ "boosting" .= toJSON boostingQuery ]
1476+ object [ "boosting" .= boostingQuery ]
14141477
14151478 toJSON (QueryCommonTermsQuery commonTermsQuery) =
1416− object [ "common" .= toJSON commonTermsQuery ]
1479+ object [ "common" .= commonTermsQuery ]
14171480
14181481 toJSON (ConstantScoreFilter csFilter boost) =
1419− object [ "constant_score" .= toJSON csFilter
1420− , "boost" .= toJSON boost]
1482+ object [ "constant_score" .= csFilter
1483+ , "boost" .= boost]
14211484
14221485 toJSON (ConstantScoreQuery query boost) =
1423− object [ "constant_score" .= toJSON query
1424− , "boost" .= toJSON boost]
1486+ object [ "constant_score" .= query
1487+ , "boost" .= boost]
14251488
14261489 toJSON (QueryDisMaxQuery disMaxQuery) =
1427− object [ "dis_max" .= toJSON disMaxQuery ]
1490+ object [ "dis_max" .= disMaxQuery ]
14281491
14291492 toJSON (QueryFilteredQuery qFilteredQuery) =
1430− object [ "filtered" .= toJSON qFilteredQuery ]
1493+ object [ "filtered" .= qFilteredQuery ]
14311494
14321495 toJSON (QueryFuzzyLikeThisQuery fuzzyQuery) =
1433− object [ "fuzzy_like_this" .= toJSON fuzzyQuery ]
1496+ object [ "fuzzy_like_this" .= fuzzyQuery ]
14341497
14351498 toJSON (QueryFuzzyLikeFieldQuery fuzzyFieldQuery) =
1436− object [ "fuzzy_like_this_field" .= toJSON fuzzyFieldQuery ]
1499+ object [ "fuzzy_like_this_field" .= fuzzyFieldQuery ]
14371500
14381501 toJSON (QueryFuzzyQuery fuzzyQuery) =
1439− object [ "fuzzy" .= toJSON fuzzyQuery ]
1502+ object [ "fuzzy" .= fuzzyQuery ]
14401503
14411504 toJSON (QueryHasChildQuery childQuery) =
1442− object [ "has_child" .= toJSON childQuery ]
1505+ object [ "has_child" .= childQuery ]
14431506
14441507 toJSON (QueryHasParentQuery parentQuery) =
1445− object [ "has_parent" .= toJSON parentQuery ]
1508+ object [ "has_parent" .= parentQuery ]
14461509
14471510 toJSON (QueryIndicesQuery qIndicesQuery) =
1448− object [ "indices" .= toJSON qIndicesQuery ]
1511+ object [ "indices" .= qIndicesQuery ]
14491512
14501513 toJSON (MatchAllQuery boost) =
14511514 object [ "match_all" .= omitNulls [ "boost" .= boost ] ]
14521515
14531516 toJSON (QueryMoreLikeThisQuery query) =
1454− object [ "more_like_this" .= toJSON query ]
1517+ object [ "more_like_this" .= query ]
14551518
14561519 toJSON (QueryMoreLikeThisFieldQuery query) =
1457− object [ "more_like_this_field" .= toJSON query ]
1520+ object [ "more_like_this_field" .= query ]
14581521
14591522 toJSON (QueryNestedQuery query) =
1460− object [ "nested" .= toJSON query ]
1523+ object [ "nested" .= query ]
14611524
14621525 toJSON (QueryPrefixQuery query) =
1463− object [ "prefix" .= toJSON query ]
1526+ object [ "prefix" .= query ]
14641527
14651528 toJSON (QueryRangeQuery query) =
1466− object [ "range" .= toJSON query ]
1529+ object [ "range" .= query ]
14671530
14681531 toJSON (QueryRegexpQuery query) =
1469− object [ "regexp" .= toJSON query ]
1532+ object [ "regexp" .= query ]
14701533
14711534 toJSON (QuerySimpleQueryStringQuery query) =
1472− object [ "simple_query_string" .= toJSON query ]
1535+ object [ "simple_query_string" .= query ]
14731536
14741537
14751538omitNulls :: [(Text, Value)] -> Value
@@ -1482,7 +1545,7 @@ omitNulls = object . filter notNull where
14821545instance ToJSON SimpleQueryStringQuery where
14831546 toJSON SimpleQueryStringQuery {..} =
14841547 omitNulls (base ++ maybeAdd)
1485− where base = [ "query" .= toJSON simpleQueryStringQuery ]
1548+ where base = [ "query" .= simpleQueryStringQuery ]
14861549 maybeAdd = [ "fields" .= simpleQueryStringField
14871550 , "default_operator" .= simpleQueryStringOperator
14881551 , "analyzer" .= simpleQueryStringAnalyzer
@@ -1518,7 +1581,7 @@ instance ToJSON RegexpQuery where
15181581 rqQueryBoost) =
15191582 object [ rqQueryField .= omitNulls base ]
15201583 where base = [ "value" .= regexpQueryQuery
1521− , "flags" .= toJSON rqQueryFlags
1584+ , "flags" .= rqQueryFlags
15221585 , "boost" .= rqQueryBoost ]
15231586
15241587
@@ -1534,7 +1597,7 @@ instance ToJSON QueryStringQuery where
15341597 qsLenient qsLocale) =
15351598 omitNulls base
15361599 where
1537− base = [ "query" .= toJSON qsQueryString
1600+ base = [ "query" .= qsQueryString
15381601 , "default_field" .= qsDefaultField
15391602 , "default_operator" .= qsOperator
15401603 , "analyzer" .= qsAnalyzer
@@ -1556,21 +1619,21 @@ instance ToJSON QueryStringQuery where
15561619instance ToJSON RangeQuery where
15571620 toJSON (RangeQuery (FieldName fieldName) range boost) =
15581621 object [ fieldName .= conjoined ]
1559− where conjoined = [ "boost" .= toJSON boost ] ++ (rangeValueToPair range)
1622+ where conjoined = [ "boost" .= boost ] ++ (rangeValueToPair range)
15601623
15611624
15621625instance ToJSON PrefixQuery where
15631626 toJSON (PrefixQuery (FieldName fieldName) queryValue boost) =
15641627 object [ fieldName .= omitNulls base ]
1565− where base = [ "value" .= toJSON queryValue
1628+ where base = [ "value" .= queryValue
15661629 , "boost" .= boost ]
15671630
15681631
15691632instance ToJSON NestedQuery where
15701633 toJSON (NestedQuery nqPath nqScoreType nqQuery) =
1571− object [ "path" .= toJSON nqPath
1572− , "score_mode" .= toJSON nqScoreType
1573− , "query" .= toJSON nqQuery ]
1634+ object [ "path" .= nqPath
1635+ , "score_mode" .= nqScoreType
1636+ , "query" .= nqQuery ]
15741637
15751638
15761639instance ToJSON MoreLikeThisFieldQuery where
@@ -1578,7 +1641,7 @@ instance ToJSON MoreLikeThisFieldQuery where
15781641 percent mtf mqt stopwords mindf maxdf
15791642 minwl maxwl boostTerms boost analyzer) =
15801643 object [ fieldName .= omitNulls base ]
1581− where base = [ "like_text" .= toJSON text
1644+ where base = [ "like_text" .= text
15821645 , "percent_terms_to_match" .= percent
15831646 , "min_term_freq" .= mtf
15841647 , "max_query_terms" .= mqt
@@ -1597,7 +1660,7 @@ instance ToJSON MoreLikeThisQuery where
15971660 mtf mqt stopwords mindf maxdf
15981661 minwl maxwl boostTerms boost analyzer) =
15991662 omitNulls base
1600− where base = [ "like_text" .= toJSON text
1663+ where base = [ "like_text" .= text
16011664 , "fields" .= fields
16021665 , "percent_terms_to_match" .= percent
16031666 , "min_term_freq" .= mtf
@@ -1614,34 +1677,34 @@ instance ToJSON MoreLikeThisQuery where
16141677
16151678instance ToJSON IndicesQuery where
16161679 toJSON (IndicesQuery indices query noMatch) =
1617− omitNulls [ "indices" .= toJSON indices
1618− , "no_match_query" .= toJSON noMatch
1619− , "query" .= toJSON query ]
1680+ omitNulls [ "indices" .= indices
1681+ , "no_match_query" .= noMatch
1682+ , "query" .= query ]
16201683
16211684
16221685instance ToJSON HasParentQuery where
16231686 toJSON (HasParentQuery queryType query scoreType) =
1624− omitNulls [ "parent_type" .= toJSON queryType
1625− , "score_type" .= toJSON scoreType
1626− , "query" .= toJSON query ]
1687+ omitNulls [ "parent_type" .= queryType
1688+ , "score_type" .= scoreType
1689+ , "query" .= query ]
16271690
16281691
16291692instance ToJSON HasChildQuery where
16301693 toJSON (HasChildQuery queryType query scoreType) =
1631− omitNulls [ "query" .= toJSON query
1632− , "score_type" .= toJSON scoreType
1633− , "type" .= toJSON queryType ]
1694+ omitNulls [ "query" .= query
1695+ , "score_type" .= scoreType
1696+ , "type" .= queryType ]
16341697
16351698
16361699instance ToJSON FuzzyQuery where
16371700 toJSON (FuzzyQuery (FieldName fieldName) queryText
16381701 prefixLength maxEx fuzziness boost) =
16391702 object [ fieldName .= omitNulls base ]
1640− where base = [ "value" .= toJSON queryText
1641− , "fuzziness" .= toJSON fuzziness
1642− , "prefix_length" .= toJSON prefixLength
1643− , "boost" .= toJSON boost
1644− , "max_expansions" .= toJSON maxEx ]
1703+ where base = [ "value" .= queryText
1704+ , "fuzziness" .= fuzziness
1705+ , "prefix_length" .= prefixLength
1706+ , "boost" .= boost
1707+ , "max_expansions" .= maxEx ]
16451708
16461709
16471710instance ToJSON FuzzyLikeFieldQuery where
@@ -1649,41 +1712,41 @@ instance ToJSON FuzzyLikeFieldQuery where
16491712 fieldText maxTerms ignoreFreq fuzziness prefixLength
16501713 boost analyzer) =
16511714 object [ fieldName .=
1652− omitNulls [ "like_text" .= toJSON fieldText
1653− , "max_query_terms" .= toJSON maxTerms
1654− , "ignore_tf" .= toJSON ignoreFreq
1655− , "fuzziness" .= toJSON fuzziness
1656− , "prefix_length" .= toJSON prefixLength
1657− , "analyzer" .= toJSON analyzer
1658− , "boost" .= toJSON boost ]]
1715+ omitNulls [ "like_text" .= fieldText
1716+ , "max_query_terms" .= maxTerms
1717+ , "ignore_tf" .= ignoreFreq
1718+ , "fuzziness" .= fuzziness
1719+ , "prefix_length" .= prefixLength
1720+ , "analyzer" .= analyzer
1721+ , "boost" .= boost ]]
16591722
16601723
16611724instance ToJSON FuzzyLikeThisQuery where
16621725 toJSON (FuzzyLikeThisQuery fields text maxTerms
16631726 ignoreFreq fuzziness prefixLength boost analyzer) =
16641727 omitNulls base
1665− where base = [ "fields" .= toJSON fields
1666− , "like_text" .= toJSON text
1667− , "max_query_terms" .= toJSON maxTerms
1668− , "ignore_tf" .= toJSON ignoreFreq
1669− , "fuzziness" .= toJSON fuzziness
1670− , "prefix_length" .= toJSON prefixLength
1671− , "analyzer" .= toJSON analyzer
1672− , "boost" .= toJSON boost ]
1728+ where base = [ "fields" .= fields
1729+ , "like_text" .= text
1730+ , "max_query_terms" .= maxTerms
1731+ , "ignore_tf" .= ignoreFreq
1732+ , "fuzziness" .= fuzziness
1733+ , "prefix_length" .= prefixLength
1734+ , "analyzer" .= analyzer
1735+ , "boost" .= boost ]
16731736
16741737
16751738instance ToJSON FilteredQuery where
16761739 toJSON (FilteredQuery query fFilter) =
1677− object [ "query" .= toJSON query
1678− , "filter" .= toJSON fFilter ]
1740+ object [ "query" .= query
1741+ , "filter" .= fFilter ]
16791742
16801743
16811744instance ToJSON DisMaxQuery where
16821745 toJSON (DisMaxQuery queries tiebreaker boost) =
16831746 omitNulls base
1684− where base = [ "queries" .= toJSON queries
1685− , "boost" .= toJSON boost
1686− , "tie_breaker" .= toJSON tiebreaker ]
1747+ where base = [ "queries" .= queries
1748+ , "boost" .= boost
1749+ , "tie_breaker" .= tiebreaker ]
16871750
16881751
16891752instance ToJSON CommonTermsQuery where
@@ -1691,38 +1754,38 @@ instance ToJSON CommonTermsQuery where
16911754 (QueryString query) cf lfo hfo msm
16921755 boost analyzer disableCoord) =
16931756 object [fieldName .= omitNulls base ]
1694− where base = [ "query" .= toJSON query
1695− , "cutoff_frequency" .= toJSON cf
1696− , "low_freq_operator" .= toJSON lfo
1697− , "minimum_should_match" .= toJSON msm
1698− , "boost" .= toJSON boost
1699− , "analyzer" .= toJSON analyzer
1700− , "disable_coord" .= toJSON disableCoord
1701− , "high_freq_operator" .= toJSON hfo ]
1757+ where base = [ "query" .= query
1758+ , "cutoff_frequency" .= cf
1759+ , "low_freq_operator" .= lfo
1760+ , "minimum_should_match" .= msm
1761+ , "boost" .= boost
1762+ , "analyzer" .= analyzer
1763+ , "disable_coord" .= disableCoord
1764+ , "high_freq_operator" .= hfo ]
17021765
17031766
17041767instance ToJSON CommonMinimumMatch where
17051768 toJSON (CommonMinimumMatch mm) = toJSON mm
17061769 toJSON (CommonMinimumMatchHighLow (MinimumMatchHighLow lowF highF)) =
1707− object [ "low_freq" .= toJSON lowF
1708− , "high_freq" .= toJSON highF ]
1770+ object [ "low_freq" .= lowF
1771+ , "high_freq" .= highF ]
17091772
17101773instance ToJSON BoostingQuery where
17111774 toJSON (BoostingQuery bqPositiveQuery bqNegativeQuery bqNegativeBoost) =
1712− object [ "positive" .= toJSON bqPositiveQuery
1713− , "negative" .= toJSON bqNegativeQuery
1714− , "negative_boost" .= toJSON bqNegativeBoost ]
1775+ object [ "positive" .= bqPositiveQuery
1776+ , "negative" .= bqNegativeQuery
1777+ , "negative_boost" .= bqNegativeBoost ]
17151778
17161779
17171780instance ToJSON BoolQuery where
17181781 toJSON (BoolQuery mustM notM shouldM bqMin boost disableCoord) =
17191782 omitNulls base
1720− where base = [ "must" .= toJSON mustM
1721− , "must_not" .= toJSON notM
1722− , "should" .= toJSON shouldM
1723− , "minimum_should_match" .= toJSON bqMin
1724− , "boost" .= toJSON boost
1725− , "disable_coord" .= toJSON disableCoord ]
1783+ where base = [ "must" .= mustM
1784+ , "must_not" .= notM
1785+ , "should" .= shouldM
1786+ , "minimum_should_match" .= bqMin
1787+ , "boost" .= boost
1788+ , "disable_coord" .= disableCoord ]
17261789
17271790
17281791instance ToJSON MatchQuery where
@@ -1732,13 +1795,13 @@ instance ToJSON MatchQuery where
17321795 analyzer maxExpansions lenient) =
17331796 object [ fieldName .= omitNulls base ]
17341797 where base = [ "query" .= mqQueryString
1735− , "operator" .= toJSON booleanOperator
1736− , "zero_terms_query" .= toJSON zeroTermsQuery
1737− , "cutoff_frequency" .= toJSON cutoffFrequency
1738− , "type" .= toJSON matchQueryType
1739− , "analyzer" .= toJSON analyzer
1740− , "max_expansions" .= toJSON maxExpansions
1741− , "lenient" .= toJSON lenient ]
1798+ , "operator" .= booleanOperator
1799+ , "zero_terms_query" .= zeroTermsQuery
1800+ , "cutoff_frequency" .= cutoffFrequency
1801+ , "type" .= matchQueryType
1802+ , "analyzer" .= analyzer
1803+ , "max_expansions" .= maxExpansions
1804+ , "lenient" .= lenient ]
17421805
17431806
17441807instance ToJSON MultiMatchQuery where
@@ -1747,14 +1810,14 @@ instance ToJSON MultiMatchQuery where
17471810 object ["multi_match" .= omitNulls base]
17481811 where base = [ "fields" .= fmap toJSON fields
17491812 , "query" .= query
1750− , "operator" .= toJSON boolOp
1751− , "zero_terms_query" .= toJSON ztQ
1752− , "tiebreaker" .= toJSON tb
1753− , "type" .= toJSON mmqt
1754− , "cutoff_frequency" .= toJSON cf
1755− , "analyzer" .= toJSON analyzer
1756− , "max_expansions" .= toJSON maxEx
1757− , "lenient" .= toJSON lenient ]
1813+ , "operator" .= boolOp
1814+ , "zero_terms_query" .= ztQ
1815+ , "tiebreaker" .= tb
1816+ , "type" .= mmqt
1817+ , "cutoff_frequency" .= cf
1818+ , "analyzer" .= analyzer
1819+ , "max_expansions" .= maxEx
1820+ , "lenient" .= lenient ]
17581821
17591822
17601823instance ToJSON MultiMatchQueryType where
@@ -1866,7 +1929,7 @@ instance ToJSON FieldHighlight where
18661929
18671930instance ToJSON Highlights where
18681931 toJSON (Highlights global fields) =
1869− omitNulls (("fields" .= toJSON fields)
1932+ omitNulls (("fields" .= fields)
18701933 : highlightSettingsPairs global)
18711934
18721935instance ToJSON HighlightSettings where
@@ -1944,16 +2007,16 @@ instance ToJSON SortSpec where
19442007 (DefaultSort (FieldName dsSortFieldName) dsSortOrder dsIgnoreUnmapped
19452008 dsSortMode dsMissingSort dsNestedFilter)) =
19462009 object [dsSortFieldName .= omitNulls base] where
1947− base = [ "order" .= toJSON dsSortOrder
2010+ base = [ "order" .= dsSortOrder
19482011 , "ignore_unmapped" .= dsIgnoreUnmapped
19492012 , "mode" .= dsSortMode
19502013 , "missing" .= dsMissingSort
19512014 , "nested_filter" .= dsNestedFilter ]
19522015
19532016 toJSON (GeoDistanceSortSpec gdsSortOrder (GeoPoint (FieldName field) gdsLatLon) units) =
1954− object [ "unit" .= toJSON units
1955− , field .= toJSON gdsLatLon
1956− , "order" .= toJSON gdsSortOrder ]
2017+ object [ "unit" .= units
2018+ , field .= gdsLatLon
2019+ , "order" .= gdsSortOrder ]
19572020
19582021
19592022instance ToJSON SortOrder where
@@ -2015,7 +2078,7 @@ instance ToJSON OptimizeBbox where
20152078instance ToJSON GeoBoundingBoxConstraint where
20162079 toJSON (GeoBoundingBoxConstraint
20172080 (FieldName gbbcGeoBBField) gbbcConstraintBox cache type') =
2018− object [gbbcGeoBBField .= toJSON gbbcConstraintBox
2081+ object [gbbcGeoBBField .= gbbcConstraintBox
20192082 , "_cache" .= cache
20202083 , "type" .= type']
20212084
@@ -2027,8 +2090,8 @@ instance ToJSON GeoFilterType where
20272090
20282091instance ToJSON GeoBoundingBox where
20292092 toJSON (GeoBoundingBox gbbTopLeft gbbBottomRight) =
2030− object ["top_left" .= toJSON gbbTopLeft
2031− , "bottom_right" .= toJSON gbbBottomRight]
2093+ object ["top_left" .= gbbTopLeft
2094+ , "bottom_right" .= gbbBottomRight]
20322095
20332096
20342097instance ToJSON LatLon where
@@ -2061,9 +2124,9 @@ instance ToJSON Term where
20612124
20622125
20632126instance ToJSON BoolMatch where
2064− toJSON (MustMatch term cache) = object ["must" .= toJSON term,
2127+ toJSON (MustMatch term cache) = object ["must" .= term,
20652128 "_cache" .= cache]
2066− toJSON (MustNotMatch term cache) = object ["must_not" .= toJSON term,
2129+ toJSON (MustNotMatch term cache) = object ["must_not" .= term,
20672130 "_cache" .= cache]
20682131 toJSON (ShouldMatch terms cache) = object ["should" .= fmap toJSON terms,
20692132 "_cache" .= cache]