@@ -70,6 +70,7 @@ module Database.Bloodhound.Types
7070 , Reply
7171 , EsResult(..)
7272 , EsResultFound(..)
73+ , EsError(..)
7374 , DocVersion
7475 , ExternalDocVersion(..)
7576 , VersionControl(..)
@@ -493,13 +494,18 @@ data EsResult a = EsResult { _index :: Text
493494 , _id :: Text
494495 , foundResult :: Maybe (EsResultFound a)} deriving (Eq, Show)
495496
496−
497497{-| 'EsResultFound' contains the document and its metadata inside of an
498498 'EsResult' when the document was successfully found.
499499-}
500500data EsResultFound a = EsResultFound { _version :: DocVersion
501501 , _source :: a } deriving (Eq, Show)
502502
503+{-| 'EsError' is the generic type that will be returned when there was a
504+ problem. If you can't parse the expected response, its a good idea to
505+ try parsing this.
506+-}
507+data EsError = EsError { errorStatus :: Int
508+ , errorMessage :: Text } deriving (Eq, Show)
503509
504510
505511{-| 'DocVersion' is an integer version number for a document between 1
@@ -833,7 +839,7 @@ data SearchType = SearchTypeQueryThenFetch
833839 deriving (Eq, Show)
834840
835841data Source =
836− NoSource
842+ NoSource
837843 | SourcePatterns PatternOrPatterns
838844 | SourceIncludeExclude Include Exclude
839845 deriving (Show, Eq)
@@ -1382,7 +1388,7 @@ data Hit a =
13821388 , hitType :: MappingName
13831389 , hitDocId :: DocId
13841390 , hitScore :: Score
1385− , hitSource :: a
1391+ , hitSource :: Maybe a
13861392 , hitHighlight :: Maybe HitHighlight } deriving (Eq, Show)
13871393
13881394data ShardResult =
@@ -2120,48 +2126,91 @@ instance ToJSON MatchQueryType where
21202126instance ToJSON FieldName where
21212127 toJSON (FieldName fieldName) = String fieldName
21222128
2123−instance ToJSON ReplicaCount
2124−instance ToJSON ShardCount
2125−instance ToJSON CutoffFrequency
2126−instance ToJSON Analyzer
2127−instance ToJSON MaxExpansions
2128−instance ToJSON Lenient
2129−instance ToJSON Boost
2130−instance ToJSON Version
2131−instance ToJSON Tiebreaker
2132−instance ToJSON MinimumMatch
2133−instance ToJSON DisableCoord
2134−instance ToJSON PrefixLength
2135−instance ToJSON Fuzziness
2136−instance ToJSON IgnoreTermFrequency
2137−instance ToJSON MaxQueryTerms
2138−instance ToJSON TypeName
2139−instance ToJSON IndexName
2140−instance ToJSON TemplateName
2141−instance ToJSON TemplatePattern
2142−instance ToJSON BoostTerms
2143−instance ToJSON MaxWordLength
2144−instance ToJSON MinWordLength
2145−instance ToJSON MaxDocFrequency
2146−instance ToJSON MinDocFrequency
2147−instance ToJSON PhraseSlop
2148−instance ToJSON StopWord
2149−instance ToJSON QueryPath
2150−instance ToJSON MinimumTermFrequency
2151−instance ToJSON PercentMatch
2152−instance ToJSON MappingName
2153−instance ToJSON DocId
2154−instance ToJSON QueryString
2155−instance ToJSON AllowLeadingWildcard
2156−instance ToJSON LowercaseExpanded
2157−instance ToJSON AnalyzeWildcard
2158−instance ToJSON GeneratePhraseQueries
2159−instance ToJSON Locale
2160−instance ToJSON EnablePositionIncrements
2161−instance FromJSON Version
2162−instance FromJSON IndexName
2163−instance FromJSON MappingName
2164−instance FromJSON DocId
2129+instance ToJSON ReplicaCount where
2130+ toJSON = genericToJSON defaultOptions
2131+instance ToJSON ShardCount where
2132+ toJSON = genericToJSON defaultOptions
2133+instance ToJSON CutoffFrequency where
2134+ toJSON = genericToJSON defaultOptions
2135+instance ToJSON Analyzer where
2136+ toJSON = genericToJSON defaultOptions
2137+instance ToJSON MaxExpansions where
2138+ toJSON = genericToJSON defaultOptions
2139+instance ToJSON Lenient where
2140+ toJSON = genericToJSON defaultOptions
2141+instance ToJSON Boost where
2142+ toJSON = genericToJSON defaultOptions
2143+instance ToJSON Version where
2144+ toJSON = genericToJSON defaultOptions
2145+instance ToJSON Tiebreaker where
2146+ toJSON = genericToJSON defaultOptions
2147+instance ToJSON MinimumMatch where
2148+ toJSON = genericToJSON defaultOptions
2149+instance ToJSON DisableCoord where
2150+ toJSON = genericToJSON defaultOptions
2151+instance ToJSON PrefixLength where
2152+ toJSON = genericToJSON defaultOptions
2153+instance ToJSON Fuzziness where
2154+ toJSON = genericToJSON defaultOptions
2155+instance ToJSON IgnoreTermFrequency where
2156+ toJSON = genericToJSON defaultOptions
2157+instance ToJSON MaxQueryTerms where
2158+ toJSON = genericToJSON defaultOptions
2159+instance ToJSON TypeName where
2160+ toJSON = genericToJSON defaultOptions
2161+instance ToJSON IndexName where
2162+ toJSON = genericToJSON defaultOptions
2163+instance ToJSON TemplateName where
2164+ toJSON = genericToJSON defaultOptions
2165+instance ToJSON TemplatePattern where
2166+ toJSON = genericToJSON defaultOptions
2167+instance ToJSON BoostTerms where
2168+ toJSON = genericToJSON defaultOptions
2169+instance ToJSON MaxWordLength where
2170+ toJSON = genericToJSON defaultOptions
2171+instance ToJSON MinWordLength where
2172+ toJSON = genericToJSON defaultOptions
2173+instance ToJSON MaxDocFrequency where
2174+ toJSON = genericToJSON defaultOptions
2175+instance ToJSON MinDocFrequency where
2176+ toJSON = genericToJSON defaultOptions
2177+instance ToJSON PhraseSlop where
2178+ toJSON = genericToJSON defaultOptions
2179+instance ToJSON StopWord where
2180+ toJSON = genericToJSON defaultOptions
2181+instance ToJSON QueryPath where
2182+ toJSON = genericToJSON defaultOptions
2183+instance ToJSON MinimumTermFrequency where
2184+ toJSON = genericToJSON defaultOptions
2185+instance ToJSON PercentMatch where
2186+ toJSON = genericToJSON defaultOptions
2187+instance ToJSON MappingName where
2188+ toJSON = genericToJSON defaultOptions
2189+instance ToJSON DocId where
2190+ toJSON = genericToJSON defaultOptions
2191+instance ToJSON QueryString where
2192+ toJSON = genericToJSON defaultOptions
2193+instance ToJSON AllowLeadingWildcard where
2194+ toJSON = genericToJSON defaultOptions
2195+instance ToJSON LowercaseExpanded where
2196+ toJSON = genericToJSON defaultOptions
2197+instance ToJSON AnalyzeWildcard where
2198+ toJSON = genericToJSON defaultOptions
2199+instance ToJSON GeneratePhraseQueries where
2200+ toJSON = genericToJSON defaultOptions
2201+instance ToJSON Locale where
2202+ toJSON = genericToJSON defaultOptions
2203+instance ToJSON EnablePositionIncrements where
2204+ toJSON = genericToJSON defaultOptions
2205+
2206+instance FromJSON Version where
2207+ parseJSON = genericParseJSON defaultOptions
2208+instance FromJSON IndexName where
2209+ parseJSON = genericParseJSON defaultOptions
2210+instance FromJSON MappingName where
2211+ parseJSON = genericParseJSON defaultOptions
2212+instance FromJSON DocId where
2213+ parseJSON = genericParseJSON defaultOptions
21652214
21662215
21672216instance FromJSON Status where
@@ -2280,6 +2329,12 @@ instance (FromJSON a) => FromJSON (EsResultFound a) where
22802329 v .: "_source"
22812330 parseJSON _ = empty
22822331
2332+instance FromJSON EsError where
2333+ parseJSON (Object v) = EsError <$>
2334+ v .: "status" <*>
2335+ v .: "error"
2336+ parseJSON _ = empty
2337+
22832338instance ToJSON Search where
22842339 toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize _ sFields sSource) =
22852340 omitNulls [ "query" .= query
@@ -2543,11 +2598,11 @@ instance (FromJSON a) => FromJSON (SearchHits a) where
25432598
25442599instance (FromJSON a) => FromJSON (Hit a) where
25452600 parseJSON (Object v) = Hit <$>
2546− v .: "_index" <*>
2547− v .: "_type" <*>
2548− v .: "_id" <*>
2549− v .: "_score" <*>
2550− v .: "_source" <*>
2601+ v .: "_index" <*>
2602+ v .: "_type" <*>
2603+ v .: "_id" <*>
2604+ v .: "_score" <*>
2605+ v .:? "_source" <*>
25512606 v .:? "highlight"
25522607 parseJSON _ = empty
25532608