@@ -60,6 +60,7 @@ module Database.Bloodhound.Types
6060 , Server(..)
6161 , Reply
6262 , EsResult(..)
63+ , EsResultFound(..)
6364 , DocVersion
6465 , ExternalDocVersion(..)
6566 , VersionControl(..)
@@ -394,14 +395,21 @@ data BulkOperation =
394395 | BulkUpdate IndexName MappingName DocId Value deriving (Eq, Show)
395396
396397{-| 'EsResult' describes the standard wrapper JSON document that you see in
397− successful Elasticsearch responses.
398+ successful Elasticsearch lookups or lookups that couldn't find the document.
398399-}
399400data EsResult a = EsResult { _index :: Text
400401 , _type :: Text
401402 , _id :: Text
402− , _version :: DocVersion
403− , found :: Maybe Bool
404− , _source :: a } deriving (Eq, Show)
403+ , foundResult :: Maybe (EsResultFound a)} deriving (Eq, Show)
404+
405+
406+{-| 'EsResultFound' contains the document and its metadata inside of an
407+ 'EsResult' when the document was successfully found.
408+-}
409+data EsResultFound a = EsResultFound { _version :: DocVersion
410+ , _source :: a } deriving (Eq, Show)
411+
412+
405413
406414{-| 'DocVersion' is an integer version number for a document between 1
407415and 9.2e+18 used for <<https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html optimistic concurrency control>>.
@@ -2039,15 +2047,22 @@ instance ToJSON IndexTemplate where
20392047 merge _ _ = undefined
20402048
20412049instance (FromJSON a) => FromJSON (EsResult a) where
2042− parseJSON (Object v) = EsResult <$>
2043− v .: "_index" <*>
2044− v .: "_type" <*>
2045− v .: "_id" <*>
2046− v .: "_version" <*>
2047− v .:? "found" <*>
2048− v .: "_source"
2050+ parseJSON jsonVal@(Object v) = do
2051+ found <- v .:? "found" .!= False
2052+ fr <- if found
2053+ then parseJSON jsonVal
2054+ else return Nothing
2055+ EsResult <$> v .: "_index" <*>
2056+ v .: "_type" <*>
2057+ v .: "_id" <*>
2058+ pure fr
20492059 parseJSON _ = empty
20502060
2061+instance (FromJSON a) => FromJSON (EsResultFound a) where
2062+ parseJSON (Object v) = EsResultFound <$>
2063+ v .: "_version" <*>
2064+ v .: "_source"
2065+ parseJSON _ = empty
20512066
20522067instance ToJSON Search where
20532068 toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize sFields) =