@@ -325,6 +325,11 @@ module Database.V5.Bloodhound.Types
325 , rrGroupRefNum
325 , rrGroupRefNum
326 , mkRRGroupRefNum
326 , mkRRGroupRefNum
327 , RestoreIndexSettings(..)
327 , RestoreIndexSettings(..)
330+ , PhraseSuggester(..)
331+ , PhraseSuggesterHighlighter(..)
332+ , PhraseSuggesterCollate(..)
329 , Aggregation(..)
334 , Aggregation(..)
330 , Aggregations
335 , Aggregations
@@ -380,7 +385,8 @@ import Control.Monad.Writer (MonadWriter)
380import Data.Aeson
385import Data.Aeson
381import Data.Aeson.Types (Pair, Parser,
386import Data.Aeson.Types (Pair, Parser,
382 emptyObject,
387 emptyObject,
383− parseEither, parseMaybe)
388+ parseEither, parseMaybe,
384import qualified Data.ByteString.Lazy.Char8 as L
390import qualified Data.ByteString.Lazy.Char8 as L
385import Data.Char
391import Data.Char
386import Data.Hashable (Hashable)
392import Data.Hashable (Hashable)
@@ -1097,7 +1103,7 @@ unpackId (DocId docId) = docId
1098type TrackSortScores = Bool
1104type TrackSortScores = Bool
1099newtype From = From Int deriving (Eq, Read, Show, Generic, ToJSON)
1105newtype From = From Int deriving (Eq, Read, Show, Generic, ToJSON)
1100−newtype Size = Size Int deriving (Eq, Read, Show, Generic, ToJSON)
1106+newtype Size = Size Int deriving (Eq, Read, Show, Generic, ToJSON, FromJSON)
1102data Search = Search { queryBody :: Maybe Query
1108data Search = Search { queryBody :: Maybe Query
1103 , filterBody :: Maybe Filter
1109 , filterBody :: Maybe Filter
@@ -5095,3 +5101,122 @@ newtype MaybeNA a = MaybeNA { unMaybeNA :: Maybe a }
5095instance FromJSON a => FromJSON (MaybeNA a) where
5101instance FromJSON a => FromJSON (MaybeNA a) where
5096 parseJSON (String "NA") = pure $ MaybeNA Nothing
5102 parseJSON (String "NA") = pure $ MaybeNA Nothing
5097 parseJSON o = MaybeNA . Just <$> parseJSON o
5103 parseJSON o = MaybeNA . Just <$> parseJSON o
5105+data Suggest = Suggest { suggestText :: Text
5106+ , suggestName :: Text
5107+ , suggestType :: SuggestType
5109+ deriving (Show, Generic)
5111+instance ToJSON Suggest where
5112+ toJSON Suggest{..} = object [ "text" .= suggestText
5113+ , suggestName .= suggestType
5116+instance FromJSON Suggest where
5117+ parseJSON (Object o) = do
5118+ suggestText' <- o .: "text"
5119+ let dropTextList = HM.toList $ HM.filterWithKey (\x _ -> x /= "text") o
5120+ suggestName' <- case dropTextList of
5121+ [(x, _)] -> return x
5122+ _ -> fail "error parsing Suggest field name"
5123+ suggestType' <- o .: suggestName'
5124+ return $ Suggest suggestText' suggestName' suggestType'
5125+ parseJSON x = typeMismatch "Suggest" x
5127+data SuggestType = SuggestTypePhraseSuggester PhraseSuggester
5128+ deriving (Show, Generic)
5130+instance ToJSON SuggestType where
5131+ toJSON (SuggestTypePhraseSuggester x) = object ["phrase" .= x]
5133+instance FromJSON SuggestType where
5134+ parseJSON = withObject "SuggestType" parse
5135+ where parse o = phraseSuggester `taggedWith` "phrase"
5136+ where taggedWith parser k = parser =<< o .: k
5137+ phraseSuggester = pure . SuggestTypePhraseSuggester
5139+data PhraseSuggester =
5140+ PhraseSuggester { phraseSuggesterField :: FieldName
5141+ , phraseSuggesterGramSize :: Maybe Int
5142+ , phraseSuggesterRealWordErrorLikelihood :: Maybe Int
5143+ , phraseSuggesterConfidence :: Maybe Int
5144+ , phraseSuggesterMaxErrors :: Maybe Int
5145+ , phraseSuggesterSeparator :: Maybe Text
5146+ , phraseSuggesterSize :: Maybe Size
5147+ , phraseSuggesterAnalyzer :: Maybe Analyzer
5148+ , phraseSuggesterShardSize :: Maybe Int
5149+ , phraseSuggesterHighlight :: Maybe PhraseSuggesterHighlighter
5150+ , phraseSuggesterCollate :: Maybe PhraseSuggesterCollate
5152+ deriving (Show, Generic)
5154+instance ToJSON PhraseSuggester where
5155+ toJSON PhraseSuggester{..} = omitNulls [ "field" .= phraseSuggesterField
5156+ , "gram_size" .= phraseSuggesterGramSize
5157+ , "real_word_error_likelihood" .= phraseSuggesterRealWordErrorLikelihood
5158+ , "confidence" .= phraseSuggesterConfidence
5159+ , "max_errors" .= phraseSuggesterMaxErrors
5160+ , "separator" .= phraseSuggesterSeparator
5161+ , "size" .= phraseSuggesterSize
5162+ , "analyzer" .= phraseSuggesterAnalyzer
5163+ , "shard_size" .= phraseSuggesterShardSize
5164+ , "highlight" .= phraseSuggesterHighlight
5165+ , "collate" .= phraseSuggesterCollate
5168+instance FromJSON PhraseSuggester where
5169+ parseJSON = withObject "PhraseSuggester" parse
5170+ where parse o = PhraseSuggester
5172+ <*> o .:? "gram_size"
5173+ <*> o .:? "real_word_error_likelihood"
5174+ <*> o .:? "confidence"
5175+ <*> o .:? "max_errors"
5176+ <*> o .:? "separator"
5178+ <*> o .:? "analyzer"
5179+ <*> o .:? "shard_size"
5180+ <*> o .:? "highlight"
5181+ <*> o .:? "collate"
5183+data PhraseSuggesterHighlighter =
5184+ PhraseSuggesterHighlighter { phraseSuggesterHighlighterPreTag :: Text
5185+ , phraseSuggesterHighlighterPostTag :: Text
5187+ deriving (Show, Generic)
5189+instance ToJSON PhraseSuggesterHighlighter where
5190+ toJSON PhraseSuggesterHighlighter{..} =
5191+ object [ "pre_tag" .= phraseSuggesterHighlighterPreTag
5192+ , "post_tag" .= phraseSuggesterHighlighterPostTag
5195+instance FromJSON PhraseSuggesterHighlighter where
5196+ parseJSON = withObject "PhraseSuggesterHighlighter" parse
5197+ where parse o = PhraseSuggesterHighlighter
5199+ <*> o .: "post_tag"
5201+data PhraseSuggesterCollate =
5202+ PhraseSuggesterCollate { phraseSuggesterCollateTemplateQuery :: TemplateQueryInline
5203+ , phraseSuggesterCollatePrune :: Bool
5205+ deriving (Show, Generic)
5207+instance ToJSON PhraseSuggesterCollate where
5208+ toJSON PhraseSuggesterCollate{..} = object [ "query" .= object
5209+ [ "inline" .= (inline phraseSuggesterCollateTemplateQuery)
5211+ , "params" .= (params phraseSuggesterCollateTemplateQuery)
5212+ , "prune" .= phraseSuggesterCollatePrune
5215+instance FromJSON PhraseSuggesterCollate where
5216+ parseJSON (Object o) = do
5217+ query' <- o .: "query"
5218+ inline' <- query' .: "inline"
5219+ params' <- o .: "params"
5220+ prune' <- o .:? "prune" .!= False
5221+ return $ PhraseSuggesterCollate (TemplateQueryInline inline' params') prune'
5222+ parseJSON x = typeMismatch "PhraseSuggesterCollate" x