{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE OverloadedStrings #-} module Database.Bloodhound.Internal.Newtypes where import Bloodhound.Import import qualified Data.Map.Strict as M newtype From = From Int deriving (Eq, Show, ToJSON) newtype Size = Size Int deriving (Eq, Show, ToJSON, FromJSON) -- Used with scripts newtype HitFields = HitFields (M.Map Text [Value]) deriving (Eq, Show) instance FromJSON HitFields where parseJSON x = HitFields <$> parseJSON x -- Slight misnomer. type Score = Maybe Double newtype ShardId = ShardId { shardId :: Int } deriving (Eq, Show, FromJSON) {-| 'DocId' is a generic wrapper value for expressing unique Document IDs. Can be set by the user or created by ES itself. Often used in client functions for poking at specific documents. -} newtype DocId = DocId Text deriving (Eq, Show, ToJSON, FromJSON) {-| 'FieldName' is used all over the place wherever a specific field within a document needs to be specified, usually in 'Query's or 'Filter's. -} newtype FieldName = FieldName Text deriving (Eq, Read, Show, ToJSON, FromJSON) {- | 'RelationName' describes a relation role between parend and child Documents in a Join relarionship: https://www.elastic.co/guide/en/elasticsearch/reference/current/parent-join.html -} newtype RelationName = RelationName Text deriving (Eq, Read, Show, ToJSON, FromJSON) {-| 'QueryString' is used to wrap query text bodies, be they human written or not. -} newtype QueryString = QueryString Text deriving (Eq, Show, ToJSON, FromJSON) -- {-| 'Script' is often used in place of 'FieldName' to specify more -- complex ways of extracting a value from a document. -- -} -- newtype Script = -- Script { scriptText :: Text } -- deriving (Eq, Show) {-| 'CacheName' is used in 'RegexpFilter' for describing the 'CacheKey' keyed caching behavior. -} newtype CacheName = CacheName Text deriving (Eq, Show, FromJSON, ToJSON) {-| 'CacheKey' is used in 'RegexpFilter' to key regex caching. -} newtype CacheKey = CacheKey Text deriving (Eq, Show, FromJSON, ToJSON) newtype Existence = Existence Bool deriving (Eq, Show, FromJSON, ToJSON) newtype NullValue = NullValue Bool deriving (Eq, Show, FromJSON, ToJSON) newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, FromJSON, ToJSON) newtype Analyzer = Analyzer Text deriving (Eq, Show, FromJSON, ToJSON) newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, FromJSON, ToJSON) {-| 'Lenient', if set to true, will cause format based failures to be ignored. I don't know what the bloody default is, Elasticsearch documentation didn't say what it was. Let me know if you figure it out. -} newtype Lenient = Lenient Bool deriving (Eq, Show, FromJSON, ToJSON) newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, FromJSON, ToJSON) {-| 'MinimumMatch' controls how many should clauses in the bool query should match. Can be an absolute value (2) or a percentage (30%) or a combination of both. -} newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show, FromJSON, ToJSON) newtype DisableCoord = DisableCoord Bool deriving (Eq, Show, FromJSON, ToJSON) newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show, FromJSON, ToJSON) newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show, FromJSON, ToJSON) newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show, FromJSON, ToJSON) {-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -} newtype PrefixLength = PrefixLength Int deriving (Eq, Show, FromJSON, ToJSON) newtype PercentMatch = PercentMatch Double deriving (Eq, Show, FromJSON, ToJSON) newtype StopWord = StopWord Text deriving (Eq, Show, FromJSON, ToJSON) newtype QueryPath = QueryPath Text deriving (Eq, Show, FromJSON, ToJSON) {-| Allowing a wildcard at the beginning of a word (eg "*ing") is particularly heavy, because all terms in the index need to be examined, just in case they match. Leading wildcards can be disabled by setting 'AllowLeadingWildcard' to false. -} newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show, FromJSON, ToJSON) newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show, FromJSON, ToJSON) newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show, FromJSON, ToJSON) {-| By default, wildcard terms in a query are not analyzed. Setting 'AnalyzeWildcard' to true enables best-effort analysis. -} newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show, FromJSON, ToJSON) {-| 'GeneratePhraseQueries' defaults to false. -} newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show, FromJSON, ToJSON) {-| 'Locale' is used for string conversions - defaults to ROOT. -} newtype Locale = Locale Text deriving (Eq, Show, FromJSON, ToJSON) newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show, FromJSON, ToJSON) newtype MinWordLength = MinWordLength Int deriving (Eq, Show, FromJSON, ToJSON) {-| 'PhraseSlop' sets the default slop for phrases, 0 means exact phrase matches. Default is 0. -} newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show, FromJSON, ToJSON) newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, FromJSON, ToJSON) newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, FromJSON, ToJSON) -- | Indicates whether the relevance score of a matching parent document is aggregated into its child documents. newtype AggregateParentScore = AggregateParentScore Bool deriving (Eq, Show, FromJSON, ToJSON) -- | Indicates whether to ignore an unmapped parent_type and not return any documents instead of an error. newtype IgnoreUnmapped = IgnoreUnmapped Bool deriving (Eq, Show, FromJSON, ToJSON) {-| Maximum number of child documents that match the query allowed for a returned parent document. If the parent document exceeds this limit, it is excluded from the search results. -} newtype MinChildren = MinChildren Int deriving (Eq, Show, FromJSON, ToJSON) {-| Minimum number of child documents that match the query required to match the query for a returned parent document. If the parent document does not meet this limit, it is excluded from the search results. -} newtype MaxChildren = MaxChildren Int deriving (Eq, Show, FromJSON, ToJSON) -- | Newtype wrapper to parse ES's concerning tendency to in some APIs return a floating point number of milliseconds since epoch ಠ_ಠ newtype POSIXMS = POSIXMS { posixMS :: UTCTime } instance FromJSON POSIXMS where parseJSON = withScientific "POSIXMS" (return . parse) where parse n = let n' = truncate n :: Integer in POSIXMS (posixSecondsToUTCTime (fromInteger (n' `div` 1000))) newtype Boost = Boost Double deriving (Eq, Show, ToJSON, FromJSON) newtype BoostTerms = BoostTerms Double deriving (Eq, Show, ToJSON, FromJSON) {-| 'ReplicaCount' is part of 'IndexSettings' -} newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, ToJSON) {-| 'ShardCount' is part of 'IndexSettings' -} newtype ShardCount = ShardCount Int deriving (Eq, Show, ToJSON) -- This insanity is because ES *sometimes* returns Replica/Shard counts as strings instance FromJSON ReplicaCount where parseJSON v = parseAsInt v <|> parseAsString v where parseAsInt = fmap ReplicaCount . parseJSON parseAsString = withText "ReplicaCount" (fmap ReplicaCount . parseReadText) instance FromJSON ShardCount where parseJSON v = parseAsInt v <|> parseAsString v where parseAsInt = fmap ShardCount . parseJSON parseAsString = withText "ShardCount" (fmap ShardCount . parseReadText) {-| 'IndexName' is used to describe which index to query/create/delete -} newtype IndexName = IndexName Text deriving (Eq, Show, ToJSON, FromJSON) newtype IndexAliasName = IndexAliasName { indexAliasName :: IndexName } deriving (Eq, Show, ToJSON) newtype MaybeNA a = MaybeNA { unMaybeNA :: Maybe a } deriving (Show, Eq) instance FromJSON a => FromJSON (MaybeNA a) where parseJSON (String "NA") = pure $ MaybeNA Nothing parseJSON o = MaybeNA . Just <$> parseJSON o newtype SnapshotName = SnapshotName { snapshotName :: Text } deriving (Eq, Show, ToJSON, FromJSON) -- | Milliseconds newtype MS = MS NominalDiffTime -- keeps the unexported constructor warnings at bay unMS :: MS -> NominalDiffTime unMS (MS t) = t instance FromJSON MS where parseJSON = withScientific "MS" (return . MS . parse) where parse n = fromInteger (truncate n * 1000) newtype TokenFilter = TokenFilter Text deriving (Eq, Show, FromJSON, ToJSON) newtype CharFilter = CharFilter Text deriving (Eq, Show, FromJSON, ToJSON)