packages feed

bloodhound 0.9.0.0 → 0.10.0.0

raw patch · 5 files changed

+4415/−2519 lines, 5 filesdep +derivedep +errorsdep +hashabledep ~semigroupsPVP ok

version bump matches the API change (PVP)

Dependencies added: derive, errors, hashable

Dependency ranges changed: semigroups

API changes (from Hackage documentation)

- Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.MinimumMatchText
- Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.MinimumMatchText
- Database.Bloodhound.Types: type ScrollId = Text
+ Database.Bloodhound.Client: advanceScroll :: (FromJSON a, MonadBH m, MonadThrow m) => ScrollId -> NominalDiffTime -> m (Either EsError (SearchResult a))
+ Database.Bloodhound.Client: getIndexAliases :: (MonadBH m, MonadThrow m) => m (Either EsError IndexAliasesSummary)
+ Database.Bloodhound.Client: getIndexSettings :: (MonadBH m, MonadThrow m) => IndexName -> m (Either EsError IndexSettingsSummary)
+ Database.Bloodhound.Client: getInitialScroll :: MonadBH m => IndexName -> MappingName -> Search -> m (Maybe ScrollId)
+ Database.Bloodhound.Client: parseEsResponse :: (MonadThrow m, FromJSON a) => Reply -> m (Either EsError a)
+ Database.Bloodhound.Client: updateIndexAliases :: MonadBH m => NonEmpty IndexAliasAction -> m Reply
+ Database.Bloodhound.Client: updateIndexSettings :: MonadBH m => NonEmpty UpdatableIndexSetting -> IndexName -> m Reply
+ Database.Bloodhound.Types: AddAlias :: IndexAlias -> IndexAliasCreate -> IndexAliasAction
+ Database.Bloodhound.Types: AddTime :: Int -> DateMathUnit -> DateMathModifier
+ Database.Bloodhound.Types: AllAliasRouting :: RoutingValue -> AliasRouting
+ Database.Bloodhound.Types: AllocAll :: AllocationPolicy
+ Database.Bloodhound.Types: AllocNewPrimaries :: AllocationPolicy
+ Database.Bloodhound.Types: AllocNone :: AllocationPolicy
+ Database.Bloodhound.Types: AllocPrimaries :: AllocationPolicy
+ Database.Bloodhound.Types: AutoExpandReplicas :: ReplicaBounds -> UpdatableIndexSetting
+ Database.Bloodhound.Types: BlocksMetaData :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: BlocksRead :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: BlocksReadOnly :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: BlocksWrite :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: Bytes :: Int -> Bytes
+ Database.Bloodhound.Types: CacheFilterExpire :: (Maybe NominalDiffTime) -> UpdatableIndexSetting
+ Database.Bloodhound.Types: CacheFilterMaxSize :: (Maybe Bytes) -> UpdatableIndexSetting
+ Database.Bloodhound.Types: CompoundFileFormat :: Bool -> CompoundFormat
+ Database.Bloodhound.Types: DMDate :: Day -> DateMathAnchor
+ Database.Bloodhound.Types: DMDay :: DateMathUnit
+ Database.Bloodhound.Types: DMHour :: DateMathUnit
+ Database.Bloodhound.Types: DMMinute :: DateMathUnit
+ Database.Bloodhound.Types: DMMonth :: DateMathUnit
+ Database.Bloodhound.Types: DMNow :: DateMathAnchor
+ Database.Bloodhound.Types: DMSecond :: DateMathUnit
+ Database.Bloodhound.Types: DMWeek :: DateMathUnit
+ Database.Bloodhound.Types: DMYear :: DateMathUnit
+ Database.Bloodhound.Types: DateMathExpr :: DateMathAnchor -> [DateMathModifier] -> DateMathExpr
+ Database.Bloodhound.Types: DateRangeAgg :: DateRangeAggregation -> Aggregation
+ Database.Bloodhound.Types: DateRangeAggregation :: FieldName -> Maybe Text -> NonEmpty DateRangeAggRange -> DateRangeAggregation
+ Database.Bloodhound.Types: DateRangeFrom :: DateMathExpr -> DateRangeAggRange
+ Database.Bloodhound.Types: DateRangeFromAndTo :: DateMathExpr -> DateMathExpr -> DateRangeAggRange
+ Database.Bloodhound.Types: DateRangeResult :: Text -> Maybe UTCTime -> Maybe Text -> Maybe UTCTime -> Maybe Text -> Int -> Maybe AggregationResults -> DateRangeResult
+ Database.Bloodhound.Types: DateRangeTo :: DateMathExpr -> DateRangeAggRange
+ Database.Bloodhound.Types: EsProtocolException :: ByteString -> EsProtocolException
+ Database.Bloodhound.Types: ExplicitShards :: Int -> InitialShardCount
+ Database.Bloodhound.Types: FSBuffered :: FSType
+ Database.Bloodhound.Types: FSSimple :: FSType
+ Database.Bloodhound.Types: FailOnMergeFailure :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: FullMinus1Shards :: InitialShardCount
+ Database.Bloodhound.Types: FullShards :: InitialShardCount
+ Database.Bloodhound.Types: GCDeletes :: NominalDiffTime -> UpdatableIndexSetting
+ Database.Bloodhound.Types: GatewaySnapshotInterval :: NominalDiffTime -> UpdatableIndexSetting
+ Database.Bloodhound.Types: GranularAliasRouting :: (Maybe SearchAliasRouting) -> (Maybe IndexAliasRouting) -> AliasRouting
+ Database.Bloodhound.Types: IndexAlias :: IndexName -> IndexAliasName -> IndexAlias
+ Database.Bloodhound.Types: IndexAliasCreate :: Maybe AliasRouting -> Maybe Filter -> IndexAliasCreate
+ Database.Bloodhound.Types: IndexAliasName :: IndexName -> IndexAliasName
+ Database.Bloodhound.Types: IndexAliasRouting :: RoutingValue -> IndexAliasRouting
+ Database.Bloodhound.Types: IndexAliasSummary :: IndexAlias -> IndexAliasCreate -> IndexAliasSummary
+ Database.Bloodhound.Types: IndexAliasesSummary :: [IndexAliasSummary] -> IndexAliasesSummary
+ Database.Bloodhound.Types: IndexCompoundFormat :: CompoundFormat -> UpdatableIndexSetting
+ Database.Bloodhound.Types: IndexCompoundOnFlush :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: IndexConcurrency :: Int -> UpdatableIndexSetting
+ Database.Bloodhound.Types: IndexSettingsSummary :: IndexName -> IndexSettings -> [UpdatableIndexSetting] -> IndexSettingsSummary
+ Database.Bloodhound.Types: MergeSegmentVsTotalIndex :: Double -> CompoundFormat
+ Database.Bloodhound.Types: NodeAttrFilter :: NodeAttrName -> NonEmpty Text -> NodeAttrFilter
+ Database.Bloodhound.Types: NodeAttrName :: Text -> NodeAttrName
+ Database.Bloodhound.Types: NumberOfReplicas :: ReplicaCount -> UpdatableIndexSetting
+ Database.Bloodhound.Types: QuorumMinus1Shards :: InitialShardCount
+ Database.Bloodhound.Types: QuorumShards :: InitialShardCount
+ Database.Bloodhound.Types: RecoveryInitialShards :: InitialShardCount -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RefreshInterval :: NominalDiffTime -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RemoveAlias :: IndexAlias -> IndexAliasAction
+ Database.Bloodhound.Types: ReplicasBounded :: Int -> Int -> ReplicaBounds
+ Database.Bloodhound.Types: ReplicasLowerBounded :: Int -> ReplicaBounds
+ Database.Bloodhound.Types: ReplicasUnbounded :: ReplicaBounds
+ Database.Bloodhound.Types: RoundDownTo :: DateMathUnit -> DateMathModifier
+ Database.Bloodhound.Types: RoutingAllocationEnable :: AllocationPolicy -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RoutingAllocationExclude :: (NonEmpty NodeAttrFilter) -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RoutingAllocationInclude :: (NonEmpty NodeAttrFilter) -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RoutingAllocationRequire :: (NonEmpty NodeAttrFilter) -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RoutingAllocationShardsPerNode :: ShardCount -> UpdatableIndexSetting
+ Database.Bloodhound.Types: RoutingValue :: Text -> RoutingValue
+ Database.Bloodhound.Types: ScrollId :: Text -> ScrollId
+ Database.Bloodhound.Types: SearchAliasRouting :: (NonEmpty RoutingValue) -> SearchAliasRouting
+ Database.Bloodhound.Types: SubtractTime :: Int -> DateMathUnit -> DateMathModifier
+ Database.Bloodhound.Types: TTLDisablePurge :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: TranslogDisableFlush :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: TranslogFSType :: FSType -> UpdatableIndexSetting
+ Database.Bloodhound.Types: TranslogFlushThresholdOps :: Int -> UpdatableIndexSetting
+ Database.Bloodhound.Types: TranslogFlushThresholdPeriod :: NominalDiffTime -> UpdatableIndexSetting
+ Database.Bloodhound.Types: TranslogFlushThresholdSize :: Bytes -> UpdatableIndexSetting
+ Database.Bloodhound.Types: WarmerEnabled :: Bool -> UpdatableIndexSetting
+ Database.Bloodhound.Types: [aliasCreateFilter] :: IndexAliasCreate -> Maybe Filter
+ Database.Bloodhound.Types: [aliasCreateRouting] :: IndexAliasCreate -> Maybe AliasRouting
+ Database.Bloodhound.Types: [dateRangeAggs] :: DateRangeResult -> Maybe AggregationResults
+ Database.Bloodhound.Types: [dateRangeDocCount] :: DateRangeResult -> Int
+ Database.Bloodhound.Types: [dateRangeFromAsString] :: DateRangeResult -> Maybe Text
+ Database.Bloodhound.Types: [dateRangeFrom] :: DateRangeResult -> Maybe UTCTime
+ Database.Bloodhound.Types: [dateRangeKey] :: DateRangeResult -> Text
+ Database.Bloodhound.Types: [dateRangeToAsString] :: DateRangeResult -> Maybe Text
+ Database.Bloodhound.Types: [dateRangeTo] :: DateRangeResult -> Maybe UTCTime
+ Database.Bloodhound.Types: [draField] :: DateRangeAggregation -> FieldName
+ Database.Bloodhound.Types: [draFormat] :: DateRangeAggregation -> Maybe Text
+ Database.Bloodhound.Types: [draRanges] :: DateRangeAggregation -> NonEmpty DateRangeAggRange
+ Database.Bloodhound.Types: [esProtoExBody] :: EsProtocolException -> ByteString
+ Database.Bloodhound.Types: [indexAliasName] :: IndexAliasName -> IndexName
+ Database.Bloodhound.Types: [indexAliasSummaryAlias] :: IndexAliasSummary -> IndexAlias
+ Database.Bloodhound.Types: [indexAliasSummaryCreate] :: IndexAliasSummary -> IndexAliasCreate
+ Database.Bloodhound.Types: [indexAlias] :: IndexAlias -> IndexAliasName
+ Database.Bloodhound.Types: [indexAliasesSummary] :: IndexAliasesSummary -> [IndexAliasSummary]
+ Database.Bloodhound.Types: [nodeAttrFilterName] :: NodeAttrFilter -> NodeAttrName
+ Database.Bloodhound.Types: [nodeAttrFilterValues] :: NodeAttrFilter -> NonEmpty Text
+ Database.Bloodhound.Types: [routingValue] :: RoutingValue -> Text
+ Database.Bloodhound.Types: [sSummaryFixedSettings] :: IndexSettingsSummary -> IndexSettings
+ Database.Bloodhound.Types: [sSummaryIndexName] :: IndexSettingsSummary -> IndexName
+ Database.Bloodhound.Types: [sSummaryUpdateable] :: IndexSettingsSummary -> [UpdatableIndexSetting]
+ Database.Bloodhound.Types: [srcIndex] :: IndexAlias -> IndexName
+ Database.Bloodhound.Types: data AliasRouting
+ Database.Bloodhound.Types: data AllocationPolicy
+ Database.Bloodhound.Types: data CompoundFormat
+ Database.Bloodhound.Types: data DateMathAnchor
+ Database.Bloodhound.Types: data DateMathExpr
+ Database.Bloodhound.Types: data DateMathModifier
+ Database.Bloodhound.Types: data DateMathUnit
+ Database.Bloodhound.Types: data DateRangeAggRange
+ Database.Bloodhound.Types: data DateRangeAggregation
+ Database.Bloodhound.Types: data DateRangeResult
+ Database.Bloodhound.Types: data EsProtocolException
+ Database.Bloodhound.Types: data FSType
+ Database.Bloodhound.Types: data IndexAlias
+ Database.Bloodhound.Types: data IndexAliasAction
+ Database.Bloodhound.Types: data IndexAliasCreate
+ Database.Bloodhound.Types: data IndexAliasSummary
+ Database.Bloodhound.Types: data IndexSettingsSummary
+ Database.Bloodhound.Types: data InitialShardCount
+ Database.Bloodhound.Types: data NodeAttrFilter
+ Database.Bloodhound.Types: data ReplicaBounds
+ Database.Bloodhound.Types: data UpdatableIndexSetting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.AliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.AllocationPolicy
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.AllowLeadingWildcard
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.AnalyzeWildcard
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Analyzer
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.BoolMatch
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.BoolQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.BooleanOperator
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Boost
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.BoostTerms
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.BoostingQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CacheKey
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CacheName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CommonMinimumMatch
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CommonTermsQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CompoundFormat
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.CutoffFrequency
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.DateRangeResult
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.DisMaxQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.DisableCoord
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Distance
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.DistanceType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.DistanceUnit
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.EnablePositionIncrements
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Existence
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FieldName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FieldOrFields
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Filter
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FilteredQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Fuzziness
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.FuzzyQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.GeneratePhraseQueries
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.GeoBoundingBox
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.GeoFilterType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.HasChildQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.HasParentQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IgnoreTermFrequency
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndexAliasCreate
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndexAliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndexAliasesSummary
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndexSettings
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndexSettingsSummary
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.IndicesQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.InitialShardCount
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.LatLon
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Lenient
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Locale
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.LowercaseExpanded
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MatchQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MatchQueryType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MaxDocFrequency
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MaxExpansions
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MaxQueryTerms
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MaxWordLength
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MinDocFrequency
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MinWordLength
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MinimumMatch
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MinimumTermFrequency
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MoreLikeThisQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MultiMatchQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.MultiMatchQueryType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.NestedQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.NominalDiffTimeJSON
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.NullValue
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.OptimizeBbox
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.POSIXMS
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.PercentMatch
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.PhraseSlop
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.PrefixLength
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.PrefixQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Query
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.QueryPath
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.QueryString
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.QueryStringQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RangeExecution
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RangeQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RangeValue
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Regexp
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RegexpFlag
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RegexpFlags
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RegexpQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ReplicaBounds
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ReplicaCount
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.RoutingValue
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ScoreType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.SearchAliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ShardCount
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.SimpleQueryFlag
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.StopWord
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.TemplateName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.TemplatePattern
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Term
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.Tiebreaker
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.TypeName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.UpdatableIndexSetting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.FromJSON Database.Bloodhound.Types.ZeroTermsQuery
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.AliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.AllocationPolicy
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.CacheKey
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.CacheName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.CompoundFormat
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.DateMathExpr
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.DateRangeAggRange
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.DateRangeAggregation
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.Existence
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.IndexAlias
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.IndexAliasAction
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.IndexAliasCreate
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.IndexAliasName
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.IndexAliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.InitialShardCount
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.NominalDiffTimeJSON
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.NullValue
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.ReplicaBounds
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.RoutingValue
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.SearchAliasRouting
+ Database.Bloodhound.Types: instance Data.Aeson.Types.Class.ToJSON Database.Bloodhound.Types.UpdatableIndexSetting
+ Database.Bloodhound.Types: instance Database.Bloodhound.Types.BucketAggregation Database.Bloodhound.Types.DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.AliasRouting
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateMathExpr
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAlias
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasRouting
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.RoutingValue
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.SearchAliasRouting
+ Database.Bloodhound.Types: instance GHC.Classes.Eq Database.Bloodhound.Types.UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Classes.Ord Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance GHC.Classes.Ord Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance GHC.Classes.Ord Database.Bloodhound.Types.NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Classes.Ord Database.Bloodhound.Types.NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Classes.Ord Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance GHC.Exception.Exception Database.Bloodhound.Types.EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0AliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0BoolMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0BooleanOperator
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Bytes
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CacheKey
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CacheName
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CollectionMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CommonMinimumMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateMathExpr
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Distance
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DistanceRange
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DistanceType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0DocumentParent
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0EsError
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0EsResultFound
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Exclude
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Existence
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ExternalDocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FSType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FieldDefinition
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FieldHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FieldName
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FieldOrFields
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FilterAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FilteredQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0From
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GeoBoundingBox
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GeoFilterType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GeoPoint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GreaterThan
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GreaterThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GreaterThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0GreaterThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0HighlightEncoder
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0HighlightSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0HighlightTag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Highlights
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Include
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAlias
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexDocumentSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0LatLon
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0LessThan
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0LessThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0LessThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0LessThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Mapping
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MappingField
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MinimumMatchHighLow
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Missing
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0NonPostings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0NullValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0OpenCloseIndex
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0OptimizeBbox
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Pattern
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0PatternOrPatterns
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0PlainHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0PostingsHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RangeExecution
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Regexp
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RegexpFlags
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0RoutingValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Script
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ScrollId
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Search
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SearchAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SearchHits
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Server
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Size
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SortOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0SortSpec
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Source
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Status
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0Term
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0TermInclusion
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0TermOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ValueCountAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_0ZeroTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_10Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_10Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_10RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_10SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_10UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_11Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_11Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_11RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_11SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_11UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_12Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_12Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_12RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_12UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_13Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_13Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_13RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_13UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_14Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_14Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_14RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_14UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_15Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_15Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_15RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_15UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_16Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_16Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_16UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_17Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_17Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_17UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_18Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_18UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_19Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_19UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1AliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1BoolMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1BooleanOperator
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1CollectionMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1CommonMinimumMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DistanceType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1FSType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1FieldOrFields
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1GeoFilterType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1HighlightEncoder
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1HighlightSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1HighlightTag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1MatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Missing
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1OpenCloseIndex
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1OptimizeBbox
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1PatternOrPatterns
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1RangeExecution
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1RegexpFlags
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1SortOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1SortSpec
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1Source
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1TermInclusion
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1ValueCountAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_1ZeroTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_20Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_20UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_21Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_21UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_22Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_22UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_23Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_23UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_24Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_24UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_25Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_25UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_26Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_26UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_27UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2BoolMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2DistanceType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2HighlightSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Missing
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2RegexpFlags
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2Source
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_2VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_3VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_4VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_5UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_6UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_7UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_8UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_9Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_9Query
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_9RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_9SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Constructor Database.Bloodhound.Types.C1_9UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1AliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1BoolMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1BooleanOperator
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Bytes
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CacheKey
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CacheName
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CollectionMode
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CommonMinimumMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateMathExpr
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Distance
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DistanceRange
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DistanceType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1DocumentParent
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1EsError
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1EsResultFound
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Exclude
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Existence
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ExternalDocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FSType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FieldDefinition
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FieldHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FieldName
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FieldOrFields
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FilterAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FilteredQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1From
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GeoBoundingBox
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GeoFilterType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GeoPoint
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GreaterThan
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GreaterThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GreaterThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1GreaterThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1HighlightEncoder
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1HighlightSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1HighlightTag
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Highlights
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Include
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAlias
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexDocumentSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1LatLon
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1LessThan
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1LessThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1LessThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1LessThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Mapping
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MappingField
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MinimumMatchHighLow
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Missing
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1NonPostings
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1NullValue
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1OpenCloseIndex
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1OptimizeBbox
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Pattern
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1PatternOrPatterns
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1PlainHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1PostingsHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Query
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RangeExecution
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Regexp
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RegexpFlags
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1RoutingValue
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Script
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ScrollId
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Search
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SearchAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SearchHits
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Server
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Size
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SortOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1SortSpec
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Source
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Status
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1Term
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1TermInclusion
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1TermOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ValueCountAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Datatype Database.Bloodhound.Types.D1ZeroTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic (Database.Bloodhound.Types.EsResult a)
+ Database.Bloodhound.Types: instance GHC.Generics.Generic (Database.Bloodhound.Types.EsResultFound a)
+ Database.Bloodhound.Types: instance GHC.Generics.Generic (Database.Bloodhound.Types.Hit a)
+ Database.Bloodhound.Types: instance GHC.Generics.Generic (Database.Bloodhound.Types.SearchHits a)
+ Database.Bloodhound.Types: instance GHC.Generics.Generic (Database.Bloodhound.Types.SearchResult a)
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Aggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.AliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.BoolMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.BooleanOperator
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.BulkOperation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CacheKey
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CacheName
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CollectionMode
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CommonMinimumMatch
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateMathExpr
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Distance
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DistanceRange
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DistanceType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DistanceUnit
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.DocumentParent
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.EsError
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Exclude
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ExecutionHint
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Existence
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ExternalDocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FieldDefinition
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FieldHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FieldName
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FieldOrFields
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FieldType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Filter
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FilterAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FilteredQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.From
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GeoBoundingBox
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GeoFilterType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GeoPoint
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GreaterThan
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GreaterThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GreaterThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.GreaterThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.HighlightEncoder
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.HighlightSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.HighlightTag
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Highlights
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Include
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAlias
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexDocumentSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Interval
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.LatLon
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.LessThan
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.LessThanD
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.LessThanEq
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.LessThanEqD
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Mapping
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MappingField
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MinimumMatchHighLow
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Missing
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.MultiMatchQueryType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.NonPostings
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.NullValue
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.OpenCloseIndex
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.OptimizeBbox
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Pattern
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.PatternOrPatterns
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.PlainHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.PostingsHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Query
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RangeExecution
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RangeValue
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Regexp
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RegexpFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RegexpFlags
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.RoutingValue
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ScoreType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Script
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Search
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SearchAliasRouting
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SearchType
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Server
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SimpleQueryFlag
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Size
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SortMode
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SortOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.SortSpec
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Source
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Status
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.Term
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.TermInclusion
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.TermOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.UpdatableIndexSetting
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ValueCountAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.VersionControl
+ Database.Bloodhound.Types: instance GHC.Generics.Generic Database.Bloodhound.Types.ZeroTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Distance
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DistanceRange
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0DocVersion
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0EsError
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0EsResultFound
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FieldDefinition
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FilterAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FilteredQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0GeoBoundingBox
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0GeoPoint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Highlights
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexAlias
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexDocumentSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0LatLon
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Mapping
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MappingField
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MinimumMatchHighLow
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0NonPostings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0PlainHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0RoutingValue
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Script
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0SearchHits
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Status
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0Term
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0TermOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_0TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_10MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_10MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_10QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_10Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_11MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_11MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_11QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_12MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_12MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_12QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_13QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_14QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_15QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_16QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Distance
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1DistanceRange
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1EsError
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1EsResultFound
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FilterAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FilteredQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1GeoBoundingBox
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1GeoPoint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Highlights
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexAlias
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexDocumentSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexSettings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1LatLon
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Mapping
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MappingField
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MinimumMatchHighLow
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1NonPostings
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1PlainHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1SearchHits
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Status
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1Term
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1TermOrder
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_1TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2BoostingQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2DisMaxQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2HasChildQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2HasParentQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2IndicesQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2NestedQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2PrefixQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2RangeQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2SearchHits
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2Status
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_2TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3EsResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3GeoBoundingBoxConstraint
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3RegexpQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3Status
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_3TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4Status
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_4TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5BoolQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5DefaultSort
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5FuzzyQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5Hit
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5SearchResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_5TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6CommonHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6FastVectorHighlight
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6SimpleQueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_6TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7DateHistogramAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7FuzzyLikeFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7FuzzyLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_7TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8CommonTermsQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_8TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9MatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9MoreLikeThisQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9MultiMatchQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9QueryStringQuery
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9Search
+ Database.Bloodhound.Types: instance GHC.Generics.Selector Database.Bloodhound.Types.S1_0_9TermsAggregation
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.AliasRouting
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.AllocationPolicy
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.Bytes
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.CompoundFormat
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateMathAnchor
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateMathExpr
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateMathModifier
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateMathUnit
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateRangeAggRange
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateRangeAggregation
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.DateRangeResult
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.EsProtocolException
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.FSType
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAlias
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasAction
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasCreate
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasName
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasRouting
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasSummary
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexAliasesSummary
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.IndexSettingsSummary
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.InitialShardCount
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.NodeAttrFilter
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.NodeAttrName
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.ReplicaBounds
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.RoutingValue
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.ScrollId
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.SearchAliasRouting
+ Database.Bloodhound.Types: instance GHC.Show.Show Database.Bloodhound.Types.UpdatableIndexSetting
+ Database.Bloodhound.Types: newtype Bytes
+ Database.Bloodhound.Types: newtype IndexAliasName
+ Database.Bloodhound.Types: newtype IndexAliasRouting
+ Database.Bloodhound.Types: newtype IndexAliasesSummary
+ Database.Bloodhound.Types: newtype NodeAttrName
+ Database.Bloodhound.Types: newtype RoutingValue
+ Database.Bloodhound.Types: newtype ScrollId
+ Database.Bloodhound.Types: newtype SearchAliasRouting
- Database.Bloodhound.Client: scanSearch :: (FromJSON a, MonadBH m) => IndexName -> MappingName -> Search -> m [Hit a]
+ Database.Bloodhound.Client: scanSearch :: (FromJSON a, MonadBH m, MonadThrow m) => IndexName -> MappingName -> Search -> m [Hit a]
- Database.Bloodhound.Types: FofFields :: [FieldName] -> FieldOrFields
+ Database.Bloodhound.Types: FofFields :: (NonEmpty FieldName) -> FieldOrFields
- Database.Bloodhound.Types: MoreLikeThisFieldQuery :: Text -> FieldName -> Maybe PercentMatch -> Maybe MinimumTermFrequency -> Maybe MaxQueryTerms -> Maybe [StopWord] -> Maybe MinDocFrequency -> Maybe MaxDocFrequency -> Maybe MinWordLength -> Maybe MaxWordLength -> Maybe BoostTerms -> Maybe Boost -> Maybe Analyzer -> MoreLikeThisFieldQuery
+ Database.Bloodhound.Types: MoreLikeThisFieldQuery :: Text -> FieldName -> Maybe PercentMatch -> Maybe MinimumTermFrequency -> Maybe MaxQueryTerms -> Maybe (NonEmpty StopWord) -> Maybe MinDocFrequency -> Maybe MaxDocFrequency -> Maybe MinWordLength -> Maybe MaxWordLength -> Maybe BoostTerms -> Maybe Boost -> Maybe Analyzer -> MoreLikeThisFieldQuery
- Database.Bloodhound.Types: MoreLikeThisQuery :: Text -> Maybe [FieldName] -> Maybe PercentMatch -> Maybe MinimumTermFrequency -> Maybe MaxQueryTerms -> Maybe [StopWord] -> Maybe MinDocFrequency -> Maybe MaxDocFrequency -> Maybe MinWordLength -> Maybe MaxWordLength -> Maybe BoostTerms -> Maybe Boost -> Maybe Analyzer -> MoreLikeThisQuery
+ Database.Bloodhound.Types: MoreLikeThisQuery :: Text -> Maybe (NonEmpty FieldName) -> Maybe PercentMatch -> Maybe MinimumTermFrequency -> Maybe MaxQueryTerms -> Maybe (NonEmpty StopWord) -> Maybe MinDocFrequency -> Maybe MaxDocFrequency -> Maybe MinWordLength -> Maybe MaxWordLength -> Maybe BoostTerms -> Maybe Boost -> Maybe Analyzer -> MoreLikeThisQuery
- Database.Bloodhound.Types: SimpleQueryStringQuery :: QueryString -> Maybe FieldOrFields -> Maybe BooleanOperator -> Maybe Analyzer -> Maybe [SimpleQueryFlag] -> Maybe LowercaseExpanded -> Maybe Locale -> SimpleQueryStringQuery
+ Database.Bloodhound.Types: SimpleQueryStringQuery :: QueryString -> Maybe FieldOrFields -> Maybe BooleanOperator -> Maybe Analyzer -> Maybe (NonEmpty SimpleQueryFlag) -> Maybe LowercaseExpanded -> Maybe Locale -> SimpleQueryStringQuery
- Database.Bloodhound.Types: TermsQuery :: (NonEmpty Term) -> Query
+ Database.Bloodhound.Types: TermsQuery :: Text -> (NonEmpty Text) -> Query
- Database.Bloodhound.Types: [moreLikeThisFieldStopWords] :: MoreLikeThisFieldQuery -> Maybe [StopWord]
+ Database.Bloodhound.Types: [moreLikeThisFieldStopWords] :: MoreLikeThisFieldQuery -> Maybe (NonEmpty StopWord)
- Database.Bloodhound.Types: [moreLikeThisFields] :: MoreLikeThisQuery -> Maybe [FieldName]
+ Database.Bloodhound.Types: [moreLikeThisFields] :: MoreLikeThisQuery -> Maybe (NonEmpty FieldName)
- Database.Bloodhound.Types: [moreLikeThisStopWords] :: MoreLikeThisQuery -> Maybe [StopWord]
+ Database.Bloodhound.Types: [moreLikeThisStopWords] :: MoreLikeThisQuery -> Maybe (NonEmpty StopWord)
- Database.Bloodhound.Types: [simpleQueryStringFlags] :: SimpleQueryStringQuery -> Maybe [SimpleQueryFlag]
+ Database.Bloodhound.Types: [simpleQueryStringFlags] :: SimpleQueryStringQuery -> Maybe (NonEmpty SimpleQueryFlag)

Files

bloodhound.cabal view
@@ -1,5 +1,5 @@ name:                bloodhound-version:             0.9.0.0+version:             0.10.0.0 synopsis:            ElasticSearch client library for Haskell description:         ElasticSearch made awesome for Haskell hackers homepage:            https://github.com/bitemyapp/bloodhound@@ -7,7 +7,7 @@ license-file:        LICENSE author:              Chris Allen maintainer:          cma@bitemyapp.com-copyright:           2014, Chris Allen+copyright:           2015, Chris Allen category:            Database, Search build-type:          Custom cabal-version:       >=1.10@@ -34,7 +34,7 @@                        aeson            >= 0.10    && <0.11,                        http-client      >= 0.3     && <0.5,                        network-uri      >= 2.6     && <2.7,-                       semigroups       >= 0.15    && <0.18,+                       semigroups       >= 0.15    && <0.19,                        time             >= 1.4     && <1.6,                        text             >= 0.11    && <1.3,                        mtl              >= 1.0     && <2.3,@@ -45,7 +45,8 @@                        data-default-class,                        blaze-builder,                        unordered-containers,-                       mtl-compat+                       mtl-compat,+                       hashable   default-language:    Haskell2010  test-suite tests@@ -68,7 +69,9 @@                        vector,                        unordered-containers >= 0.2.5.0 && <0.3,                        mtl,-                       quickcheck-properties+                       quickcheck-properties,+                       derive,+                       errors   default-language:    Haskell2010  test-suite doctests
changelog.md view
@@ -1,3 +1,35 @@+0.10.0.0+===================++Thanks to the following people, Bloodhound 0.10.0.0 is being released! This one gets a bit messy due to the Aeson 0.10 upgrade, so you may want to wait for the dust to settle. YMMV.++* @MichaelXavier+  - #77: Add test for error parsing+  - #76/#78: Support for updating (modifying) index settings+  - #79/#80: Index aliases+  - #81: Low-level scroll API support+  - #82: Date range aggregation++* @bitemyapp+  - Fucked around with dependencies and broke things in order to upgrade to Aeson 0.10+  - Please forgive me.++0.9.0.0+===================++Thanks to the following people, Bloodhound 0.9.0.0 is being released!++* @MichaelXavier+  - #75: A more explicit type for errors+  - #74: Add readme and changelog to extra source files++* @MaxDaten+  - #38/#73 Provide safety by using URL-encoding++* @centromere+  - #72 Added parent support to documentExists++ 0.8.0.0 =================== 
src/Database/Bloodhound/Client.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE OverloadedStrings   #-}-{-# LANGUAGE RecordWildCards     #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RecordWildCards   #-}  ------------------------------------------------------------------------------- -- |@@ -24,9 +24,13 @@          withBH        , createIndex        , deleteIndex+       , updateIndexSettings+       , getIndexSettings        , indexExists        , openIndex        , closeIndex+       , updateIndexAliases+       , getIndexAliases        , putTemplate        , templateExists        , deleteTemplate@@ -40,6 +44,8 @@        , searchByIndex        , searchByType        , scanSearch+       , getInitialScroll+       , advanceScroll        , refreshIndex        , mkSearch        , mkAggregateSearch@@ -55,10 +61,11 @@        , isVersionConflict        , isSuccess        , isCreated+       , parseEsResponse        )        where -import qualified Blaze.ByteString.Builder as BB+import qualified Blaze.ByteString.Builder     as BB import           Control.Applicative import           Control.Monad import           Control.Monad.Catch@@ -66,13 +73,17 @@ import           Data.Aeson import           Data.ByteString.Lazy.Builder import qualified Data.ByteString.Lazy.Char8   as L+import           Data.Foldable                (toList)+import qualified Data.HashMap.Strict          as HM import           Data.Ix-import qualified Data.List                    as LS (filter)+import qualified Data.List                    as LS (filter, foldl')+import           Data.List.NonEmpty           (NonEmpty (..)) import           Data.Maybe                   (fromMaybe, isJust) import           Data.Monoid import           Data.Text                    (Text) import qualified Data.Text                    as T import qualified Data.Text.Encoding           as T+import           Data.Time.Clock import qualified Data.Vector                  as V import           Network.HTTP.Client import qualified Network.HTTP.Types.Method    as NHTM@@ -119,13 +130,19 @@ --                      , message  = "Use haskell!" --                      , age      = 10000 --                      , location = Location 40.12 (-71.34) }---instance ToJSON   Tweet---instance FromJSON Tweet---instance ToJSON   Location---instance FromJSON Location+--instance ToJSON   Tweet where+--  toJSON = genericToJSON defaultOptions+--instance FromJSON Tweet where+--  parseJSON = genericParseJSON defaultOptions+--instance ToJSON   Location where+--  toJSON = genericToJSON defaultOptions+--instance FromJSON Location where+--  parseJSON = genericParseJSON defaultOptions --data BulkTest = BulkTest { name :: Text } deriving (Eq, Generic, Show)---instance FromJSON BulkTest---instance ToJSON BulkTest+--instance FromJSON BulkTest where+--  parseJSON = genericParseJSON defaultOptions+--instance ToJSON BulkTest where+--  toJSON = genericToJSON defaultOptions -- :}  -- | 'mkShardCount' is a straight-forward smart constructor for 'ShardCount'@@ -250,6 +267,7 @@   where url = joinPath [indexName]         body = Just $ encode indexSettings + -- | 'deleteIndex' will delete an index given a 'Server', and an 'IndexName'. -- -- >>> _ <- runBH' $ createIndex defaultIndexSettings (IndexName "didimakeanindex")@@ -262,6 +280,35 @@ deleteIndex (IndexName indexName) =   delete =<< joinPath [indexName] +-- | 'updateIndexSettings' will apply a non-empty list of setting updates to an index+--+-- >>> _ <- runBH' $ createIndex defaultIndexSettings (IndexName "unconfiguredindex")+-- >>> response <- runBH' $ updateIndexSettings (BlocksWrite False :| []) (IndexName "unconfiguredindex")+-- >>> respIsTwoHunna response+-- True+updateIndexSettings :: MonadBH m => NonEmpty UpdatableIndexSetting -> IndexName -> m Reply+updateIndexSettings updates (IndexName indexName) =+  bindM2 put url (return body)+  where url = joinPath [indexName, "_settings"]+        body = Just (encode jsonBody)+        jsonBody = Object (deepMerge [u | Object u <- toJSON <$> toList updates])+++getIndexSettings :: (MonadBH m, MonadThrow m) => IndexName+                 -> m (Either EsError IndexSettingsSummary)+getIndexSettings (IndexName indexName) = do+  parseEsResponse =<< get =<< url+  where url = joinPath [indexName, "_settings"]+++deepMerge :: [Object] -> Object+deepMerge = LS.foldl' go mempty+  where go acc = LS.foldl' go' acc . HM.toList+        go' acc (k, v) = HM.insertWith merge k v acc+        merge (Object a) (Object b) = Object (deepMerge [a, b])+        merge _ b = b++ statusCodeIs :: Int -> Reply -> Bool statusCodeIs n resp = NHTS.statusCode (responseStatus resp) == n @@ -273,6 +320,27 @@   reply <- head url   return (reply, respIsTwoHunna reply) ++-- | Tries to parse a response body as the expected type @a@ and+-- failing that tries to parse it as an EsError. All well-formed, JSON+-- responses from elasticsearch should fall into these two+-- categories. If they don't, a 'EsProtocolException' will be+-- thrown. If you encounter this, please report the full body it+-- reports along with your ElasticSearch verison.+parseEsResponse :: (MonadThrow m, FromJSON a) => Reply+                -> m (Either EsError a)+parseEsResponse reply+  | respIsTwoHunna reply = case eitherDecode body of+                             Right a -> return (Right a)+                             Left _ -> tryParseError+  | otherwise = tryParseError+  where body = responseBody reply+        tryParseError = case eitherDecode body of+                          Right e -> return (Left e)+                          -- this case should not be possible+                          Left _ -> explode+        explode = throwM (EsProtocolException body)+ -- | 'indexExists' enables you to check if an index exists. Returns 'Bool' --   in IO --@@ -317,6 +385,35 @@ closeIndex :: MonadBH m => IndexName -> m Reply closeIndex = openOrCloseIndexes CloseIndex ++-- | 'updateIndexAliases' updates the server's index alias+-- table. Operations are atomic. Explained in further detail at+-- <https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html>+--+-- >>> let src = IndexName "a-real-index"+-- >>> let aliasName = IndexName "an-alias"+-- >>> let iAlias = IndexAlias src (IndexAliasName aliasName)+-- >>> let aliasCreate = IndexAliasCreate Nothing Nothing+-- >>> respIsTwoHunna <$> runBH' (createIndex defaultIndexSettings src)+-- True+-- >>> runBH' $ indexExists src+-- True+-- >>> respIsTwoHunna <$> runBH' (updateIndexAliases (AddAlias iAlias aliasCreate :| []))+-- True+-- >>> runBH' $ indexExists aliasName+-- True+updateIndexAliases :: MonadBH m => NonEmpty IndexAliasAction -> m Reply+updateIndexAliases actions = bindM2 post url (return body)+  where url = joinPath ["_aliases"]+        body = Just (encode bodyJSON)+        bodyJSON = object [ "actions" .= toList actions]++-- | Get all aliases configured on the server.+getIndexAliases :: (MonadBH m, MonadThrow m)+                => m (Either EsError IndexAliasesSummary)+getIndexAliases = parseEsResponse =<< get =<< url+  where url = joinPath ["_aliases"]+ -- | 'putTemplate' creates a template given an 'IndexTemplate' and a 'TemplateName'. --   Explained in further detail at --   <https://www.elastic.co/guide/en/elasticsearch/reference/1.7/indices-templates.html>@@ -546,8 +643,12 @@   (MappingName mappingName) = bindM2 dispatchSearch url . return   where url = joinPath [indexName, mappingName, "_search"] -scanSearch' :: MonadBH m => IndexName -> MappingName -> Search -> m (Maybe ScrollId)-scanSearch' (IndexName indexName) (MappingName mappingName) search = do+-- | For a given scearch, request a scroll for efficient streaming of+-- search results. Note that the search is put into 'SearchTypeScan'+-- mode and thus results will not be sorted. Combine this with+-- 'advanceScroll' to efficiently stream through the full result set+getInitialScroll :: MonadBH m => IndexName -> MappingName -> Search -> m (Maybe ScrollId)+getInitialScroll (IndexName indexName) (MappingName mappingName) search = do     let url = joinPath [indexName, mappingName, "_search"]         search' = search { searchType = SearchTypeScan }     resp' <- bindM2 dispatchSearch url (return search')@@ -555,31 +656,54 @@         msid = maybe Nothing scrollId msr     return msid -scroll' :: (FromJSON a, MonadBH m) => Maybe ScrollId -> m ([Hit a], Maybe ScrollId)+scroll' :: (FromJSON a, MonadBH m, MonadThrow m) => Maybe ScrollId -> m ([Hit a], Maybe ScrollId) scroll' Nothing = return ([], Nothing) scroll' (Just sid) = do-    url <- joinPath ["_search/scroll?scroll=1m"]-    resp' <- post url (Just . L.fromStrict $ T.encodeUtf8 sid)-    let msr = decode' $ responseBody resp' :: FromJSON a => Maybe (SearchResult a)-        resp = case msr of-            Just sr -> (hits $ searchHits sr, scrollId sr)-            _       -> ([], Nothing)-    return resp+    res <- advanceScroll sid 60+    case res of+      Right SearchResult {..} -> return (hits searchHits, scrollId)+      Left _ -> return ([], Nothing) -simpleAccumilator :: (FromJSON a, MonadBH m) => [Hit a] -> ([Hit a], Maybe ScrollId) -> m ([Hit a], Maybe ScrollId)-simpleAccumilator oldHits (newHits, Nothing) = return (oldHits ++ newHits, Nothing)-simpleAccumilator oldHits ([], _) = return (oldHits, Nothing)-simpleAccumilator oldHits (newHits, msid) = do+-- | Use the given scroll to fetch the next page of documents. If+-- there are still further pages, there will be a value in the+-- 'scrollId' field of the 'SearchResult'+advanceScroll+  :: ( FromJSON a+     , MonadBH m+     , MonadThrow m+     )+  => ScrollId+  -> NominalDiffTime+  -- ^ How long should the snapshot of data be kept around? This timeout is updated every time 'advanceScroll' is used, so don't feel the need to set it to the entire duration of your search processing. Note that durations < 1s will be rounded up. Also note that 'NominalDiffTime' is an instance of Num so literals like 60 will be interpreted as seconds. 60s is a reasonable default.+  -> m (Either EsError (SearchResult a))+advanceScroll (ScrollId sid) scroll = do+  url <- joinPath ["_search/scroll?scroll=" <> scrollTime]+  parseEsResponse =<< post url (Just . L.fromStrict $ T.encodeUtf8 sid)+  where scrollTime = showText secs <> "s"+        secs :: Integer+        secs = round scroll++simpleAccumulator :: (FromJSON a, MonadBH m, MonadThrow m) => [Hit a] -> ([Hit a], Maybe ScrollId) -> m ([Hit a], Maybe ScrollId)+simpleAccumulator oldHits (newHits, Nothing) = return (oldHits ++ newHits, Nothing)+simpleAccumulator oldHits ([], _) = return (oldHits, Nothing)+simpleAccumulator oldHits (newHits, msid) = do     (newHits', msid') <- scroll' msid-    simpleAccumilator (oldHits ++ newHits) (newHits', msid')+    simpleAccumulator (oldHits ++ newHits) (newHits', msid')  -- | 'scanSearch' uses the 'scan&scroll' API of elastic,--- for a given 'IndexName' and 'MappingName',-scanSearch :: (FromJSON a, MonadBH m) => IndexName -> MappingName -> Search -> m [Hit a]+-- for a given 'IndexName' and 'MappingName'. Note that this will+-- consume the entire search result set and will be doing O(n) list+-- appends so this may not be suitable for large result sets. In that+-- case, 'getInitialScroll' and 'advanceScroll' are good low level+-- tools. You should be able to hook them up trivially to conduit,+-- pipes, or your favorite streaming IO abstraction of choice. Note+-- that ordering on the search would destroy performance and thus is+-- ignored.+scanSearch :: (FromJSON a, MonadBH m, MonadThrow m) => IndexName -> MappingName -> Search -> m [Hit a] scanSearch indexName mappingName search = do-    msid <- scanSearch' indexName mappingName search+    msid <- getInitialScroll indexName mappingName search     (hits, msid') <- scroll' msid-    (totalHits, _) <- simpleAccumilator [] (hits, msid')+    (totalHits, _) <- simpleAccumulator [] (hits, msid')     return totalHits  -- | 'mkSearch' is a helper function for defaulting additional fields of a 'Search'
src/Database/Bloodhound/Types.hs view
@@ -1,2433 +1,3532 @@-{-# LANGUAGE DeriveGeneric              #-}-{-# LANGUAGE FlexibleContexts           #-}-{-# LANGUAGE FlexibleInstances          #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE MultiParamTypeClasses      #-}-{-# LANGUAGE OverloadedStrings          #-}-{-# LANGUAGE RecordWildCards            #-}-{-# LANGUAGE UndecidableInstances       #-}------------------------------------------------------------------------------------ |--- Module : Database.Bloodhound.Types--- Copyright : (C) 2014 Chris Allen--- License : BSD-style (see the file LICENSE)--- Maintainer : Chris Allen <cma@bitemyapp.com--- Stability : provisional--- Portability : DeriveGeneric, RecordWildCards------ Data types for describing actions and data structures performed to interact--- with Elasticsearch. The two main buckets your queries against Elasticsearch--- will fall into are 'Query's and 'Filter's. 'Filter's are more like--- traditional database constraints and often have preferable performance--- properties. 'Query's support human-written textual queries, such as fuzzy--- queries.------------------------------------------------------------------------------------module Database.Bloodhound.Types-       ( defaultCache-       , defaultIndexSettings-       , defaultIndexDocumentSettings-       , mkSort-       , showText-       , unpackId-       , mkMatchQuery-       , mkMultiMatchQuery-       , mkBoolQuery-       , mkRangeQuery-       , mkQueryStringQuery-       , mkAggregations-       , mkTermsAggregation-       , mkTermsScriptAggregation-       , mkDateHistogram-       , mkDocVersion-       , docVersionNumber-       , toTerms-       , toDateHistogram-       , omitNulls-       , BH(..)-       , runBH-       , BHEnv(..)-       , MonadBH(..)-       , Version(..)-       , Status(..)-       , Existence(..)-       , NullValue(..)-       , IndexSettings(..)-       , IndexTemplate(..)-       , Server(..)-       , Reply-       , EsResult(..)-       , EsResultFound(..)-       , EsError(..)-       , DocVersion-       , ExternalDocVersion(..)-       , VersionControl(..)-       , DocumentParent(..)-       , IndexDocumentSettings(..)-       , Query(..)-       , Search(..)-       , SearchType(..)-       , SearchResult(..)-       , ScrollId-       , SearchHits(..)-       , TrackSortScores-       , From(..)-       , Size(..)-       , Source(..)-       , PatternOrPatterns(..)-       , Include(..)-       , Exclude(..)-       , Pattern(..)-       , ShardResult(..)-       , Hit(..)-       , Filter(..)-       , Seminearring(..)-       , BoolMatch(..)-       , Term(..)-       , GeoPoint(..)-       , GeoBoundingBoxConstraint(..)-       , GeoBoundingBox(..)-       , GeoFilterType(..)-       , Distance(..)-       , DistanceUnit(..)-       , DistanceType(..)-       , DistanceRange(..)-       , OptimizeBbox(..)-       , LatLon(..)-       , RangeValue(..)-       , RangeExecution(..)-       , LessThan(..)-       , LessThanEq(..)-       , GreaterThan(..)-       , GreaterThanEq(..)-       , LessThanD(..)-       , LessThanEqD(..)-       , GreaterThanD(..)-       , GreaterThanEqD(..)-       , Regexp(..)-       , RegexpFlags(..)-       , RegexpFlag(..)-       , FieldName(..)-       , Script(..)-       , IndexName(..)-       , TemplateName(..)-       , TemplatePattern(..)-       , MappingName(..)-       , DocId(..)-       , CacheName(..)-       , CacheKey(..)-       , BulkOperation(..)-       , ReplicaCount(..)-       , ShardCount(..)-       , Sort-       , SortMode(..)-       , SortOrder(..)-       , SortSpec(..)-       , DefaultSort(..)-       , Missing(..)-       , OpenCloseIndex(..)-       , Method-       , Boost(..)-       , MatchQuery(..)-       , MultiMatchQuery(..)-       , BoolQuery(..)-       , BoostingQuery(..)-       , CommonTermsQuery(..)-       , DisMaxQuery(..)-       , FilteredQuery(..)-       , FuzzyLikeThisQuery(..)-       , FuzzyLikeFieldQuery(..)-       , FuzzyQuery(..)-       , HasChildQuery(..)-       , HasParentQuery(..)-       , IndicesQuery(..)-       , MoreLikeThisQuery(..)-       , MoreLikeThisFieldQuery(..)-       , NestedQuery(..)-       , PrefixQuery(..)-       , QueryStringQuery(..)-       , SimpleQueryStringQuery(..)-       , RangeQuery(..)-       , RegexpQuery(..)-       , QueryString(..)-       , BooleanOperator(..)-       , ZeroTermsQuery(..)-       , CutoffFrequency(..)-       , Analyzer(..)-       , MaxExpansions(..)-       , Lenient(..)-       , MatchQueryType(..)-       , MultiMatchQueryType(..)-       , Tiebreaker(..)-       , MinimumMatch(..)-       , DisableCoord(..)-       , CommonMinimumMatch(..)-       , MinimumMatchHighLow(..)-       , PrefixLength(..)-       , Fuzziness(..)-       , IgnoreTermFrequency(..)-       , MaxQueryTerms(..)-       , ScoreType(..)-       , Score-       , Cache-       , TypeName(..)-       , BoostTerms(..)-       , MaxWordLength(..)-       , MinWordLength(..)-       , MaxDocFrequency(..)-       , MinDocFrequency(..)-       , PhraseSlop(..)-       , StopWord(..)-       , QueryPath(..)-       , MinimumTermFrequency(..)-       , PercentMatch(..)-       , FieldDefinition(..)-       , MappingField(..)-       , Mapping(..)-       , AllowLeadingWildcard(..)-       , LowercaseExpanded(..)-       , GeneratePhraseQueries(..)-       , Locale(..)-       , AnalyzeWildcard(..)-       , EnablePositionIncrements(..)-       , SimpleQueryFlag(..)-       , FieldOrFields(..)-       , Monoid(..)-       , ToJSON(..)-       , Interval(..)-       , TimeInterval(..)-       , ExecutionHint(..)-       , CollectionMode(..)-       , TermOrder(..)-       , TermInclusion(..)--       , Aggregation(..)-       , Aggregations-       , AggregationResults-       , Bucket(..)-       , BucketAggregation(..)-       , TermsAggregation(..)-       , ValueCountAggregation(..)-       , FilterAggregation(..)-       , DateHistogramAggregation(..)--       , Highlights(..)-       , FieldHighlight(..)-       , HighlightSettings(..)-       , PlainHighlight(..)-       , PostingsHighlight(..)-       , FastVectorHighlight(..)-       , CommonHighlight(..)-       , NonPostings(..)-       , HighlightEncoder(..)-       , HighlightTag(..)-       , HitHighlight--       , TermsResult(..)-       , DateHistogramResult(..)-         ) where--import           Control.Applicative-import           Control.Monad.Catch-import           Control.Monad.Except-import           Control.Monad.Reader-import           Control.Monad.State-import           Control.Monad.Writer-import           Data.Aeson-import           Data.Aeson.Types                (Pair, emptyObject, parseMaybe)-import qualified Data.ByteString.Lazy.Char8      as L-import qualified Data.HashMap.Strict             as HM (union)-import           Data.List                       (foldl', nub)-import           Data.List.NonEmpty              (NonEmpty (..), toList)-import qualified Data.Map.Strict                 as M-import           Data.Maybe-import           Data.Text                       (Text)-import qualified Data.Text                       as T-import           Data.Time.Clock                 (UTCTime)-import qualified Data.Vector                     as V-import           GHC.Enum-import           GHC.Generics                    (Generic)-import           Network.HTTP.Client-import qualified Network.HTTP.Types.Method       as NHTM--import           Database.Bloodhound.Types.Class---- $setup--- >>> :set -XOverloadedStrings--- >>> import Database.Bloodhound--- >>> let testServer = (Server "http://localhost:9200")--- >>> let testIndex = IndexName "twitter"--- >>> let testMapping = MappingName "tweet"--- >>> let defaultIndexSettings = IndexSettings (ShardCount 3) (ReplicaCount 2)---- defaultIndexSettings is exported by Database.Bloodhound as well--- no trailing slashes in servers, library handles building the path.--{-| Common environment for Elasticsearch calls. Connections will be-    pipelined according to the provided HTTP connection manager.--}-data BHEnv = BHEnv { bhServer  :: Server-                   , bhManager :: Manager-                   }--{-| All API calls to Elasticsearch operate within-    MonadBH. The idea is that it can be easily embedded in your-    own monad transformer stack. A default instance for a ReaderT and-    alias 'BH' is provided for the simple case.--}-class (Functor m, Applicative m, MonadIO m) => MonadBH m where-  getBHEnv :: m BHEnv--newtype BH m a = BH {-      unBH :: ReaderT BHEnv m a-    } deriving ( Functor-               , Applicative-               , Monad-               , MonadIO-               , MonadState s-               , MonadWriter w-               , MonadError e-               , Alternative-               , MonadPlus-               , MonadFix-               , MonadThrow-               , MonadCatch-               , MonadMask)--instance MonadTrans BH where-  lift = BH . lift--instance (MonadReader r m) => MonadReader r (BH m) where-    ask = lift ask-    local f (BH (ReaderT m)) = BH $ ReaderT $ \r ->-      local f (m r)--instance (Functor m, Applicative m, MonadIO m) => MonadBH (BH m) where-  getBHEnv = BH getBHEnv---instance (Functor m, Applicative m, MonadIO m) => MonadBH (ReaderT BHEnv m) where-  getBHEnv = ask--runBH :: BHEnv -> BH m a -> m a-runBH e f = runReaderT (unBH f) e--{-| 'Version' is embedded in 'Status' -}-data Version = Version { number          :: Text-                       , build_hash      :: Text-                       , build_timestamp :: UTCTime-                       , build_snapshot  :: Bool-                       , lucene_version  :: Text } deriving (Eq, Show, Generic)--{-| 'Status' is a data type for describing the JSON body returned by-    Elasticsearch when you query its status. This was deprecated in 1.2.0.--   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-status.html#indices-status>--}--data Status = Status { ok      :: Maybe Bool-                     , status  :: Int-                     , name    :: Text-                     , version :: Version-                     , tagline :: Text } deriving (Eq, Show)--{-| 'IndexSettings' is used to configure the shards and replicas when you create-   an Elasticsearch Index.--   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>--}--data IndexSettings =-  IndexSettings { indexShards   :: ShardCount-                , indexReplicas :: ReplicaCount } deriving (Eq, Show)--{-| 'defaultIndexSettings' is an 'IndexSettings' with 3 shards and 2 replicas. -}-defaultIndexSettings :: IndexSettings-defaultIndexSettings =  IndexSettings (ShardCount 3) (ReplicaCount 2)--{-| 'Reply' and 'Method' are type synonyms from 'Network.HTTP.Types.Method.Method' -}-type Reply = Network.HTTP.Client.Response L.ByteString-type Method = NHTM.Method--{-| 'OpenCloseIndex' is a sum type for opening and closing indices.--   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html>--}-data OpenCloseIndex = OpenIndex | CloseIndex deriving (Eq, Show)--data FieldType = GeoPointType-               | GeoShapeType-               | FloatType-               | IntegerType-               | LongType-               | ShortType-               | ByteType deriving (Eq, Show)--data FieldDefinition =-  FieldDefinition { fieldType :: FieldType } deriving (Eq, Show)--{-| An 'IndexTemplate' defines a template that will automatically be-    applied to new indices created. The templates include both-    'IndexSettings' and mappings, and a simple 'TemplatePattern' that-    controls if the template will be applied to the index created.-    Specify mappings as follows: @[toJSON TweetMapping, ...]@--    https://www.elastic.co/guide/en/elasticsearch/reference/1.7/indices-templates.html--}-data IndexTemplate =-  IndexTemplate { templatePattern  :: TemplatePattern-                , templateSettings :: Maybe IndexSettings-                , templateMappings :: [Value]-                }--data MappingField =-  MappingField   { mappingFieldName :: FieldName-                 , fieldDefinition  :: FieldDefinition } deriving (Eq, Show)--{-| Support for type reification of 'Mapping's is currently incomplete, for-    now the mapping API verbiage expects a 'ToJSON'able blob.--    Indexes have mappings, mappings are schemas for the documents contained in the-    index. I'd recommend having only one mapping per index, always having a mapping,-    and keeping different kinds of documents separated if possible.--}-data Mapping = Mapping { typeName      :: TypeName-                       , mappingFields :: [MappingField] } deriving (Eq, Show)--{-| 'BulkOperation' is a sum type for expressing the four kinds of bulk-    operation index, create, delete, and update. 'BulkIndex' behaves like an-    "upsert", 'BulkCreate' will fail if a document already exists at the DocId.--   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html#docs-bulk>--}-data BulkOperation =-    BulkIndex  IndexName MappingName DocId Value-  | BulkCreate IndexName MappingName DocId Value-  | BulkDelete IndexName MappingName DocId-  | BulkUpdate IndexName MappingName DocId Value deriving (Eq, Show)--{-| 'EsResult' describes the standard wrapper JSON document that you see in-    successful Elasticsearch lookups or lookups that couldn't find the document.--}-data EsResult a = EsResult { _index      :: Text-                           , _type       :: Text-                           , _id         :: Text-                           , foundResult :: Maybe (EsResultFound a)} deriving (Eq, Show)--{-| 'EsResultFound' contains the document and its metadata inside of an-    'EsResult' when the document was successfully found.--}-data EsResultFound a = EsResultFound {  _version :: DocVersion-                                     , _source   :: a } deriving (Eq, Show)--{-| 'EsError' is the generic type that will be returned when there was a-    problem. If you can't parse the expected response, its a good idea to-    try parsing this.--}-data EsError = EsError { errorStatus  :: Int-                       , errorMessage :: Text } deriving (Eq, Show)---{-| 'DocVersion' is an integer version number for a document between 1-and 9.2e+18 used for <<https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html optimistic concurrency control>>.--}-newtype DocVersion = DocVersion {-      docVersionNumber :: Int-    } deriving (Eq, Show, Ord, ToJSON)---- | Smart constructor for in-range doc version-mkDocVersion :: Int -> Maybe DocVersion-mkDocVersion i-  | i >= (docVersionNumber minBound) && i <= (docVersionNumber maxBound) =-    Just $ DocVersion i-  | otherwise = Nothing---{-| 'ExternalDocVersion' is a convenience wrapper if your code uses its-own version numbers instead of ones from ES.--}-newtype ExternalDocVersion = ExternalDocVersion DocVersion-    deriving (Eq, Show, Ord, Bounded, Enum, ToJSON)--{-| 'VersionControl' is specified when indexing documents as a-optimistic concurrency control.--}-data VersionControl = NoVersionControl-                    -- ^ Don't send a version. This is a pure overwrite.-                    | InternalVersion DocVersion-                    -- ^ Use the default ES versioning scheme. Only-                    -- index the document if the version is the same-                    -- as the one specified. Only applicable to-                    -- updates, as you should be getting Version from-                    -- a search result.-                    | ExternalGT ExternalDocVersion-                    -- ^ Use your own version numbering. Only index-                    -- the document if the version is strictly higher-                    -- OR the document doesn't exist. The given-                    -- version will be used as the new version number-                    -- for the stored document. N.B. All updates must-                    -- increment this number, meaning there is some-                    -- global, external ordering of updates.-                    | ExternalGTE ExternalDocVersion-                    -- ^ Use your own version numbering. Only index-                    -- the document if the version is equal or higher-                    -- than the stored version. Will succeed if there-                    -- is no existing document. The given version will-                    -- be used as the new version number for the-                    -- stored document. Use with care, as this could-                    -- result in data loss.-                    | ForceVersion ExternalDocVersion-                    -- ^ The document will always be indexed and the-                    -- given version will be the new version. This is-                    -- typically used for correcting errors. Use with-                    -- care, as this could result in data loss.-                    deriving (Show, Eq, Ord)--{-| 'DocumentParent' is used to specify a parent document.--}-newtype DocumentParent = DocumentParent DocId-  deriving (Eq, Show)--{-| 'IndexDocumentSettings' are special settings supplied when indexing-a document. For the best backwards compatiblity when new fields are-added, you should probably prefer to start with 'defaultIndexDocumentSettings'--}-data IndexDocumentSettings =-  IndexDocumentSettings { idsVersionControl :: VersionControl-                        , idsParent         :: Maybe DocumentParent-                        } deriving (Eq, Show)--{-| Reasonable default settings. Chooses no version control and no parent.--}-defaultIndexDocumentSettings :: IndexDocumentSettings-defaultIndexDocumentSettings = IndexDocumentSettings NoVersionControl Nothing--{-| 'Sort' is a synonym for a list of 'SortSpec's. Sort behavior is order-    dependent with later sorts acting as tie-breakers for earlier sorts.--}-type Sort = [SortSpec]--{-| The two main kinds of 'SortSpec' are 'DefaultSortSpec' and-    'GeoDistanceSortSpec'. The latter takes a 'SortOrder', 'GeoPoint', and-    'DistanceUnit' to express "nearness" to a single geographical point as a-    sort specification.--<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>--}-data SortSpec = DefaultSortSpec DefaultSort-              | GeoDistanceSortSpec SortOrder GeoPoint DistanceUnit deriving (Eq, Show)--{-| 'DefaultSort' is usually the kind of 'SortSpec' you'll want. There's a-    'mkSort' convenience function for when you want to specify only the most-    common parameters.--<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>--}-data DefaultSort =-  DefaultSort { sortFieldName  :: FieldName-              , sortOrder      :: SortOrder-                                  -- default False-              , ignoreUnmapped :: Bool-              , sortMode       :: Maybe SortMode-              , missingSort    :: Maybe Missing-              , nestedFilter   :: Maybe Filter } deriving (Eq, Show)--{-| 'SortOrder' is 'Ascending' or 'Descending', as you might expect. These get-    encoded into "asc" or "desc" when turned into JSON.--<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>--}-data SortOrder = Ascending-               | Descending deriving (Eq, Show)--{-| 'Missing' prescribes how to handle missing fields. A missing field can be-    sorted last, first, or using a custom value as a substitute.--<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_missing_values>--}-data Missing = LastMissing-             | FirstMissing-             | CustomMissing Text deriving (Eq, Show)--{-| 'SortMode' prescribes how to handle sorting array/multi-valued fields.--http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_sort_mode_option--}-data SortMode = SortMin-              | SortMax-              | SortSum-              | SortAvg deriving (Eq, Show)--{-| 'mkSort' defaults everything but the 'FieldName' and the 'SortOrder' so-    that you can concisely describe the usual kind of 'SortSpec's you want.--}-mkSort :: FieldName -> SortOrder -> DefaultSort-mkSort fieldName sOrder = DefaultSort fieldName sOrder False Nothing Nothing Nothing--{-| 'Cache' is for telling ES whether it should cache a 'Filter' not.-    'Query's cannot be cached.--}-type Cache   = Bool -- caching on/off-defaultCache :: Cache-defaultCache = False--{-| 'PrefixValue' is used in 'PrefixQuery' as the main query component.--}-type PrefixValue = Text--{-| 'BooleanOperator' is the usual And/Or operators with an ES compatible-    JSON encoding baked in. Used all over the place.--}-data BooleanOperator = And | Or deriving (Eq, Show)--{-| 'ShardCount' is part of 'IndexSettings'--}-newtype ShardCount = ShardCount Int deriving (Eq, Show, Generic)--{-| 'ReplicaCount' is part of 'IndexSettings'--}-newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic)--{-| 'Server' is used with the client functions to point at the ES instance--}-newtype Server = Server Text deriving (Eq, Show)--{-| 'IndexName' is used to describe which index to query/create/delete--}-newtype IndexName = IndexName Text deriving (Eq, Generic, Show)--{-| 'TemplateName' is used to describe which template to query/create/delete--}-newtype TemplateName = TemplateName Text deriving (Eq, Show, Generic)--{-| 'TemplatePattern' represents a pattern which is matched against index names--}-newtype TemplatePattern = TemplatePattern Text deriving (Eq, Show, Generic)--{-| 'MappingName' is part of mappings which are how ES describes and schematizes-    the data in the indices.--}-newtype MappingName = MappingName Text deriving (Eq, Generic, Show)--{-| '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, Generic, Show)--{-| 'QueryString' is used to wrap query text bodies, be they human written or not.--}-newtype QueryString = QueryString Text deriving (Eq, Generic, Show)--{-| '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, Show)---{-| '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)--{-| 'CacheKey' is used in 'RegexpFilter' to key regex caching.--}-newtype CacheKey =-  CacheKey Text deriving (Eq, Show)-newtype Existence =-  Existence Bool deriving (Eq, Show)-newtype NullValue =-  NullValue Bool deriving (Eq, Show)-newtype CutoffFrequency =-  CutoffFrequency Double deriving (Eq, Show, Generic)-newtype Analyzer =-  Analyzer Text deriving (Eq, Show, Generic)-newtype MaxExpansions =-  MaxExpansions Int deriving (Eq, Show, Generic)--{-| '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, Generic)-newtype Tiebreaker =-  Tiebreaker Double deriving (Eq, Show, Generic)-newtype Boost =-  Boost Double deriving (Eq, Show, Generic)-newtype BoostTerms =-  BoostTerms Double deriving (Eq, Show, Generic)--{-| '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, Generic)-newtype MinimumMatchText =-  MinimumMatchText Text deriving (Eq, Show)-newtype DisableCoord =-  DisableCoord Bool deriving (Eq, Show, Generic)-newtype IgnoreTermFrequency =-  IgnoreTermFrequency Bool deriving (Eq, Show, Generic)-newtype MinimumTermFrequency =-  MinimumTermFrequency Int deriving (Eq, Show, Generic)-newtype MaxQueryTerms =-  MaxQueryTerms Int deriving (Eq, Show, Generic)-newtype Fuzziness =-  Fuzziness Double deriving (Eq, Show, Generic)--{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}-newtype PrefixLength =-  PrefixLength Int deriving (Eq, Show, Generic)-newtype TypeName =-  TypeName Text deriving (Eq, Show, Generic)-newtype PercentMatch =-  PercentMatch Double deriving (Eq, Show, Generic)-newtype StopWord =-  StopWord Text deriving (Eq, Show, Generic)-newtype QueryPath =-  QueryPath Text deriving (Eq, Show, Generic)--{-| 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, Generic)-newtype LowercaseExpanded =-  LowercaseExpanded        Bool deriving (Eq, Show, Generic)-newtype EnablePositionIncrements =-  EnablePositionIncrements Bool deriving (Eq, Show, Generic)--{-| 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, Generic)--{-| 'GeneratePhraseQueries' defaults to false.--}-newtype GeneratePhraseQueries =-  GeneratePhraseQueries Bool deriving (Eq, Show, Generic)--{-| 'Locale' is used for string conversions - defaults to ROOT.--}-newtype Locale        = Locale        Text deriving (Eq, Show, Generic)-newtype MaxWordLength = MaxWordLength Int  deriving (Eq, Show, Generic)-newtype MinWordLength = MinWordLength Int  deriving (Eq, Show, Generic)--{-| 'PhraseSlop' sets the default slop for phrases, 0 means exact-     phrase matches. Default is 0.--}-newtype PhraseSlop      = PhraseSlop      Int deriving (Eq, Show, Generic)-newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic)-newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)--{-| 'unpackId' is a silly convenience function that gets used once.--}-unpackId :: DocId -> Text-unpackId (DocId docId) = docId--type TrackSortScores = Bool-newtype From = From Int deriving (Eq, Show, ToJSON)-newtype Size = Size Int deriving (Eq, Show, ToJSON)--data Search = Search { queryBody       :: Maybe Query-                     , filterBody      :: Maybe Filter-                     , sortBody        :: Maybe Sort-                     , aggBody         :: Maybe Aggregations-                     , highlight       :: Maybe Highlights-                       -- default False-                     , trackSortScores :: TrackSortScores-                     , from            :: From-                     , size            :: Size-                     , searchType      :: SearchType-                     , fields          :: Maybe [FieldName]-                     , source          :: Maybe Source } deriving (Eq, Show)--data SearchType = SearchTypeQueryThenFetch-                | SearchTypeDfsQueryThenFetch-                | SearchTypeCount-                | SearchTypeScan-                | SearchTypeQueryAndFetch-                | SearchTypeDfsQueryAndFetch-  deriving (Eq, Show)--data Source =-    NoSource-  | SourcePatterns PatternOrPatterns-  | SourceIncludeExclude Include Exclude-    deriving (Show, Eq)--data PatternOrPatterns = PopPattern   Pattern-                       | PopPatterns [Pattern] deriving (Eq, Show)--data Include = Include [Pattern] deriving (Eq, Show)-data Exclude = Exclude [Pattern] deriving (Eq, Show)--newtype Pattern = Pattern Text deriving (Eq, Show)--data Highlights = Highlights { globalsettings  :: Maybe HighlightSettings-                             , highlightFields :: [FieldHighlight]-                             } deriving (Show, Eq)--data FieldHighlight = FieldHighlight FieldName (Maybe HighlightSettings)-                      deriving (Show, Eq)---data HighlightSettings = Plain PlainHighlight-                       | Postings PostingsHighlight-                       | FastVector FastVectorHighlight-                         deriving (Show, Eq)-data PlainHighlight =-    PlainHighlight { plainCommon  :: Maybe CommonHighlight-                   , plainNonPost :: Maybe NonPostings } deriving (Show, Eq)-- -- This requires that index_options are set to 'offset' in the mapping.-data PostingsHighlight = PostingsHighlight (Maybe CommonHighlight) deriving (Show, Eq)---- This requires that term_vector is set to 'with_positions_offsets' in the mapping.-data FastVectorHighlight =-    FastVectorHighlight { fvCommon          :: Maybe CommonHighlight-                        , fvNonPostSettings :: Maybe NonPostings-                        , boundaryChars     :: Maybe Text-                        , boundaryMaxScan   :: Maybe Int-                        , fragmentOffset    :: Maybe Int-                        , matchedFields     :: [Text]-                        , phraseLimit       :: Maybe Int-                        } deriving (Show, Eq)--data CommonHighlight =-    CommonHighlight { order             :: Maybe Text-                    , forceSource       :: Maybe Bool-                    , tag               :: Maybe HighlightTag-                    , encoder           :: Maybe HighlightEncoder-                    , noMatchSize       :: Maybe Int-                    , highlightQuery    :: Maybe Query-                    , requireFieldMatch :: Maybe Bool-                    } deriving (Show, Eq)---- Settings that are only applicable to FastVector and Plain highlighters.-data NonPostings =-    NonPostings { fragmentSize      :: Maybe Int-                , numberOfFragments :: Maybe Int} deriving (Show, Eq)--data HighlightEncoder = DefaultEncoder-                      | HTMLEncoder-                      deriving (Show, Eq)---- NOTE: Should the tags use some kind of HTML type, rather than Text?-data HighlightTag = TagSchema Text-                  | CustomTags ([Text], [Text]) -- Only uses more than the first value in the lists if fvh-                  deriving (Show, Eq)---data Query =-  TermQuery                     Term (Maybe Boost)-  | TermsQuery                  (NonEmpty Term)-  | QueryMatchQuery             MatchQuery-  | QueryMultiMatchQuery        MultiMatchQuery-  | QueryBoolQuery              BoolQuery-  | QueryBoostingQuery          BoostingQuery-  | QueryCommonTermsQuery       CommonTermsQuery-  | ConstantScoreFilter         Filter Boost-  | ConstantScoreQuery          Query Boost-  | QueryDisMaxQuery            DisMaxQuery-  | QueryFilteredQuery          FilteredQuery-  | QueryFuzzyLikeThisQuery     FuzzyLikeThisQuery-  | QueryFuzzyLikeFieldQuery    FuzzyLikeFieldQuery-  | QueryFuzzyQuery             FuzzyQuery-  | QueryHasChildQuery          HasChildQuery-  | QueryHasParentQuery         HasParentQuery-  | IdsQuery                    MappingName [DocId]-  | QueryIndicesQuery           IndicesQuery-  | MatchAllQuery               (Maybe Boost)-  | QueryMoreLikeThisQuery      MoreLikeThisQuery-  | QueryMoreLikeThisFieldQuery MoreLikeThisFieldQuery-  | QueryNestedQuery            NestedQuery-  | QueryPrefixQuery            PrefixQuery-  | QueryQueryStringQuery       QueryStringQuery-  | QuerySimpleQueryStringQuery SimpleQueryStringQuery-  | QueryRangeQuery             RangeQuery-  | QueryRegexpQuery            RegexpQuery-  deriving (Eq, Show)--data RegexpQuery =-  RegexpQuery { regexpQueryField :: FieldName-              , regexpQuery      :: Regexp-              , regexpQueryFlags :: RegexpFlags-              , regexpQueryBoost :: Maybe Boost-              } deriving (Eq, Show)--data RangeQuery =-  RangeQuery { rangeQueryField :: FieldName-             , rangeQueryRange :: RangeValue-             , rangeQueryBoost :: Boost } deriving (Eq, Show)--mkRangeQuery :: FieldName -> RangeValue -> RangeQuery-mkRangeQuery f r = RangeQuery f r (Boost 1.0)--data SimpleQueryStringQuery =-  SimpleQueryStringQuery-    { simpleQueryStringQuery             :: QueryString-    , simpleQueryStringField             :: Maybe FieldOrFields-    , simpleQueryStringOperator          :: Maybe BooleanOperator-    , simpleQueryStringAnalyzer          :: Maybe Analyzer-    , simpleQueryStringFlags             :: Maybe [SimpleQueryFlag]-    , simpleQueryStringLowercaseExpanded :: Maybe LowercaseExpanded-    , simpleQueryStringLocale            :: Maybe Locale-    } deriving (Eq, Show)--data SimpleQueryFlag =-  SimpleQueryAll-  | SimpleQueryNone-  | SimpleQueryAnd-  | SimpleQueryOr-  | SimpleQueryPrefix-  | SimpleQueryPhrase-  | SimpleQueryPrecedence-  | SimpleQueryEscape-  | SimpleQueryWhitespace-  | SimpleQueryFuzzy-  | SimpleQueryNear-  | SimpleQuerySlop deriving (Eq, Show)---- use_dis_max and tie_breaker when fields are plural?-data QueryStringQuery =-  QueryStringQuery-  { queryStringQuery                    :: QueryString-  , queryStringDefaultField             :: Maybe FieldName-  , queryStringOperator                 :: Maybe BooleanOperator-  , queryStringAnalyzer                 :: Maybe Analyzer-  , queryStringAllowLeadingWildcard     :: Maybe AllowLeadingWildcard-  , queryStringLowercaseExpanded        :: Maybe LowercaseExpanded-  , queryStringEnablePositionIncrements :: Maybe EnablePositionIncrements-  , queryStringFuzzyMaxExpansions       :: Maybe MaxExpansions-  , queryStringFuzziness                :: Maybe Fuzziness-  , queryStringFuzzyPrefixLength        :: Maybe PrefixLength-  , queryStringPhraseSlop               :: Maybe PhraseSlop-  , queryStringBoost                    :: Maybe Boost-  , queryStringAnalyzeWildcard          :: Maybe AnalyzeWildcard-  , queryStringGeneratePhraseQueries    :: Maybe GeneratePhraseQueries-  , queryStringMinimumShouldMatch       :: Maybe MinimumMatch-  , queryStringLenient                  :: Maybe Lenient-  , queryStringLocale                   :: Maybe Locale-  } deriving (Eq, Show)--mkQueryStringQuery :: QueryString -> QueryStringQuery-mkQueryStringQuery qs =-  QueryStringQuery qs Nothing Nothing-  Nothing Nothing Nothing Nothing-  Nothing Nothing Nothing Nothing-  Nothing Nothing Nothing Nothing-  Nothing Nothing--data FieldOrFields = FofField   FieldName-                   | FofFields [FieldName] deriving (Eq, Show)--data PrefixQuery =-  PrefixQuery-  { prefixQueryField       :: FieldName-  , prefixQueryPrefixValue :: Text-  , prefixQueryBoost       :: Maybe Boost } deriving (Eq, Show)--data NestedQuery =-  NestedQuery-  { nestedQueryPath      :: QueryPath-  , nestedQueryScoreType :: ScoreType-  , nestedQuery          :: Query } deriving (Eq, Show)--data MoreLikeThisFieldQuery =-  MoreLikeThisFieldQuery-  { moreLikeThisFieldText            :: Text-  , moreLikeThisFieldFields          :: FieldName-                                        -- default 0.3 (30%)-  , moreLikeThisFieldPercentMatch    :: Maybe PercentMatch-  , moreLikeThisFieldMinimumTermFreq :: Maybe MinimumTermFrequency-  , moreLikeThisFieldMaxQueryTerms   :: Maybe MaxQueryTerms-  , moreLikeThisFieldStopWords       :: Maybe [StopWord]-  , moreLikeThisFieldMinDocFrequency :: Maybe MinDocFrequency-  , moreLikeThisFieldMaxDocFrequency :: Maybe MaxDocFrequency-  , moreLikeThisFieldMinWordLength   :: Maybe MinWordLength-  , moreLikeThisFieldMaxWordLength   :: Maybe MaxWordLength-  , moreLikeThisFieldBoostTerms      :: Maybe BoostTerms-  , moreLikeThisFieldBoost           :: Maybe Boost-  , moreLikeThisFieldAnalyzer        :: Maybe Analyzer-  } deriving (Eq, Show)--data MoreLikeThisQuery =-  MoreLikeThisQuery-  { moreLikeThisText            :: Text-  , moreLikeThisFields          :: Maybe [FieldName]-    -- default 0.3 (30%)-  , moreLikeThisPercentMatch    :: Maybe PercentMatch-  , moreLikeThisMinimumTermFreq :: Maybe MinimumTermFrequency-  , moreLikeThisMaxQueryTerms   :: Maybe MaxQueryTerms-  , moreLikeThisStopWords       :: Maybe [StopWord]-  , moreLikeThisMinDocFrequency :: Maybe MinDocFrequency-  , moreLikeThisMaxDocFrequency :: Maybe MaxDocFrequency-  , moreLikeThisMinWordLength   :: Maybe MinWordLength-  , moreLikeThisMaxWordLength   :: Maybe MaxWordLength-  , moreLikeThisBoostTerms      :: Maybe BoostTerms-  , moreLikeThisBoost           :: Maybe Boost-  , moreLikeThisAnalyzer        :: Maybe Analyzer-  } deriving (Eq, Show)--data IndicesQuery =-  IndicesQuery-  { indicesQueryIndices :: [IndexName]-  , indicesQuery        :: Query-    -- default "all"-  , indicesQueryNoMatch :: Maybe Query } deriving (Eq, Show)--data HasParentQuery =-  HasParentQuery-  { hasParentQueryType      :: TypeName-  , hasParentQuery          :: Query-  , hasParentQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)--data HasChildQuery =-  HasChildQuery-  { hasChildQueryType      :: TypeName-  , hasChildQuery          :: Query-  , hasChildQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)--data ScoreType =-  ScoreTypeMax-  | ScoreTypeSum-  | ScoreTypeAvg-  | ScoreTypeNone deriving (Eq, Show)--data FuzzyQuery =-  FuzzyQuery { fuzzyQueryField         :: FieldName-             , fuzzyQueryValue         :: Text-             , fuzzyQueryPrefixLength  :: PrefixLength-             , fuzzyQueryMaxExpansions :: MaxExpansions-             , fuzzyQueryFuzziness     :: Fuzziness-             , fuzzyQueryBoost         :: Maybe Boost-             } deriving (Eq, Show)--data FuzzyLikeFieldQuery =-  FuzzyLikeFieldQuery-  { fuzzyLikeField                    :: FieldName-    -- anaphora is good for the soul.-  , fuzzyLikeFieldText                :: Text-  , fuzzyLikeFieldMaxQueryTerms       :: MaxQueryTerms-  , fuzzyLikeFieldIgnoreTermFrequency :: IgnoreTermFrequency-  , fuzzyLikeFieldFuzziness           :: Fuzziness-  , fuzzyLikeFieldPrefixLength        :: PrefixLength-  , fuzzyLikeFieldBoost               :: Boost-  , fuzzyLikeFieldAnalyzer            :: Maybe Analyzer-  } deriving (Eq, Show)--data FuzzyLikeThisQuery =-  FuzzyLikeThisQuery-  { fuzzyLikeFields              :: [FieldName]-  , fuzzyLikeText                :: Text-  , fuzzyLikeMaxQueryTerms       :: MaxQueryTerms-  , fuzzyLikeIgnoreTermFrequency :: IgnoreTermFrequency-  , fuzzyLikeFuzziness           :: Fuzziness-  , fuzzyLikePrefixLength        :: PrefixLength-  , fuzzyLikeBoost               :: Boost-  , fuzzyLikeAnalyzer            :: Maybe Analyzer-  } deriving (Eq, Show)--data FilteredQuery =-  FilteredQuery-  { filteredQuery  :: Query-  , filteredFilter :: Filter } deriving (Eq, Show)--data DisMaxQuery =-  DisMaxQuery { disMaxQueries    :: [Query]-                -- default 0.0-              , disMaxTiebreaker :: Tiebreaker-              , disMaxBoost      :: Maybe Boost-              } deriving (Eq, Show)--data MatchQuery =-  MatchQuery { matchQueryField           :: FieldName-             , matchQueryQueryString     :: QueryString-             , matchQueryOperator        :: BooleanOperator-             , matchQueryZeroTerms       :: ZeroTermsQuery-             , matchQueryCutoffFrequency :: Maybe CutoffFrequency-             , matchQueryMatchType       :: Maybe MatchQueryType-             , matchQueryAnalyzer        :: Maybe Analyzer-             , matchQueryMaxExpansions   :: Maybe MaxExpansions-             , matchQueryLenient         :: Maybe Lenient-             , matchQueryBoost           :: Maybe Boost } deriving (Eq, Show)--{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,-    enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'--}-mkMatchQuery :: FieldName -> QueryString -> MatchQuery-mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing--data MatchQueryType =-  MatchPhrase-  | MatchPhrasePrefix deriving (Eq, Show)--data MultiMatchQuery =-  MultiMatchQuery { multiMatchQueryFields          :: [FieldName]-                  , multiMatchQueryString          :: QueryString-                  , multiMatchQueryOperator        :: BooleanOperator-                  , multiMatchQueryZeroTerms       :: ZeroTermsQuery-                  , multiMatchQueryTiebreaker      :: Maybe Tiebreaker-                  , multiMatchQueryType            :: Maybe MultiMatchQueryType-                  , multiMatchQueryCutoffFrequency :: Maybe CutoffFrequency-                  , multiMatchQueryAnalyzer        :: Maybe Analyzer-                  , multiMatchQueryMaxExpansions   :: Maybe MaxExpansions-                  , multiMatchQueryLenient         :: Maybe Lenient } deriving (Eq, Show)--{-| 'mkMultiMatchQuery' is a convenience function that defaults the less common parameters,-    enabling you to provide only the list of 'FieldName's and 'QueryString' to-    make a 'MultiMatchQuery'.--}--mkMultiMatchQuery :: [FieldName] -> QueryString -> MultiMatchQuery-mkMultiMatchQuery matchFields query =-  MultiMatchQuery matchFields query-  Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing--data MultiMatchQueryType =-  MultiMatchBestFields-  | MultiMatchMostFields-  | MultiMatchCrossFields-  | MultiMatchPhrase-  | MultiMatchPhrasePrefix deriving (Eq, Show)--data BoolQuery =-  BoolQuery { boolQueryMustMatch          :: [Query]-            , boolQueryMustNotMatch       :: [Query]-            , boolQueryShouldMatch        :: [Query]-            , boolQueryMinimumShouldMatch :: Maybe MinimumMatch-            , boolQueryBoost              :: Maybe Boost-            , boolQueryDisableCoord       :: Maybe DisableCoord-            } deriving (Eq, Show)--mkBoolQuery :: [Query] -> [Query] -> [Query] -> BoolQuery-mkBoolQuery must mustNot should =-  BoolQuery must mustNot should Nothing Nothing Nothing--data BoostingQuery =-  BoostingQuery { positiveQuery :: Query-                , negativeQuery :: Query-                , negativeBoost :: Boost } deriving (Eq, Show)--data CommonTermsQuery =-  CommonTermsQuery { commonField              :: FieldName-                   , commonQuery              :: QueryString-                   , commonCutoffFrequency    :: CutoffFrequency-                   , commonLowFreqOperator    :: BooleanOperator-                   , commonHighFreqOperator   :: BooleanOperator-                   , commonMinimumShouldMatch :: Maybe CommonMinimumMatch-                   , commonBoost              :: Maybe Boost-                   , commonAnalyzer           :: Maybe Analyzer-                   , commonDisableCoord       :: Maybe DisableCoord-                   } deriving (Eq, Show)--data CommonMinimumMatch =-    CommonMinimumMatchHighLow MinimumMatchHighLow-  | CommonMinimumMatch        MinimumMatch-  deriving (Eq, Show)--data MinimumMatchHighLow =-  MinimumMatchHighLow { lowFreq  :: MinimumMatch-                      , highFreq :: MinimumMatch } deriving (Eq, Show)--data Filter = AndFilter [Filter] Cache-            | OrFilter  [Filter] Cache-            | NotFilter  Filter  Cache-            | IdentityFilter-            | BoolFilter BoolMatch-            | ExistsFilter FieldName -- always cached-            | GeoBoundingBoxFilter GeoBoundingBoxConstraint-            | GeoDistanceFilter GeoPoint Distance DistanceType OptimizeBbox Cache-            | GeoDistanceRangeFilter GeoPoint DistanceRange-            | GeoPolygonFilter FieldName [LatLon]-            | IdsFilter MappingName [DocId]-            | LimitFilter Int-            | MissingFilter FieldName Existence NullValue-            | PrefixFilter  FieldName PrefixValue Cache-            | QueryFilter   Query Cache-            | RangeFilter   FieldName RangeValue RangeExecution Cache-            | RegexpFilter  FieldName Regexp RegexpFlags CacheName Cache CacheKey-            | TermFilter    Term Cache-              deriving (Eq, Show)--data ZeroTermsQuery = ZeroTermsNone-                    | ZeroTermsAll deriving (Eq, Show)--data RangeExecution = RangeExecutionIndex-                    | RangeExecutionFielddata deriving (Eq, Show)--newtype Regexp = Regexp Text deriving (Eq, Show)--data RegexpFlags = AllRegexpFlags-                 | NoRegexpFlags-                 | SomeRegexpFlags (NonEmpty RegexpFlag) deriving (Eq, Show)--data RegexpFlag = AnyString-                | Automaton-                | Complement-                | Empty-                | Intersection-                | Interval deriving (Eq, Show)--newtype LessThan = LessThan Double deriving (Eq, Show)-newtype LessThanEq = LessThanEq Double deriving (Eq, Show)-newtype GreaterThan = GreaterThan Double deriving (Eq, Show)-newtype GreaterThanEq = GreaterThanEq Double deriving (Eq, Show)--newtype LessThanD = LessThanD UTCTime deriving (Eq, Show)-newtype LessThanEqD = LessThanEqD UTCTime deriving (Eq, Show)-newtype GreaterThanD = GreaterThanD UTCTime deriving (Eq, Show)-newtype GreaterThanEqD = GreaterThanEqD UTCTime deriving (Eq, Show)--data RangeValue = RangeDateLte LessThanEqD-                | RangeDateLt LessThanD-                | RangeDateGte GreaterThanEqD-                | RangeDateGt GreaterThanD-                | RangeDateGtLt GreaterThanD LessThanD-                | RangeDateGteLte GreaterThanEqD LessThanEqD-                | RangeDateGteLt GreaterThanEqD LessThanD-                | RangeDateGtLte GreaterThanD LessThanEqD-                | RangeDoubleLte LessThanEq-                | RangeDoubleLt LessThan-                | RangeDoubleGte GreaterThanEq-                | RangeDoubleGt GreaterThan-                | RangeDoubleGtLt GreaterThan LessThan-                | RangeDoubleGteLte GreaterThanEq LessThanEq-                | RangeDoubleGteLt GreaterThanEq LessThan-                | RangeDoubleGtLte GreaterThan LessThanEq-                deriving (Eq, Show)--rangeValueToPair :: RangeValue -> [Pair]-rangeValueToPair rv = case rv of-  RangeDateLte (LessThanEqD t)                       -> ["lte" .= t]-  RangeDateGte (GreaterThanEqD t)                    -> ["gte" .= t]-  RangeDateLt (LessThanD t)                          -> ["lt"  .= t]-  RangeDateGt (GreaterThanD t)                       -> ["gt"  .= t]-  RangeDateGteLte (GreaterThanEqD l) (LessThanEqD g) -> ["gte" .= l, "lte" .= g]-  RangeDateGtLte (GreaterThanD l) (LessThanEqD g)    -> ["gt"  .= l, "lte" .= g]-  RangeDateGteLt (GreaterThanEqD l) (LessThanD g)    -> ["gte" .= l, "lt"  .= g]-  RangeDateGtLt (GreaterThanD l) (LessThanD g)       -> ["gt"  .= l, "lt"  .= g]-  RangeDoubleLte (LessThanEq t)                      -> ["lte" .= t]-  RangeDoubleGte (GreaterThanEq t)                   -> ["gte" .= t]-  RangeDoubleLt (LessThan t)                         -> ["lt"  .= t]-  RangeDoubleGt (GreaterThan t)                      -> ["gt"  .= t]-  RangeDoubleGteLte (GreaterThanEq l) (LessThanEq g) -> ["gte" .= l, "lte" .= g]-  RangeDoubleGtLte (GreaterThan l) (LessThanEq g)    -> ["gt"  .= l, "lte" .= g]-  RangeDoubleGteLt (GreaterThanEq l) (LessThan g)    -> ["gte" .= l, "lt"  .= g]-  RangeDoubleGtLt (GreaterThan l) (LessThan g)       -> ["gt"  .= l, "lt"  .= g]--data Term = Term { termField :: Text-                 , termValue :: Text } deriving (Eq, Show)--data BoolMatch = MustMatch    Term  Cache-               | MustNotMatch Term  Cache-               | ShouldMatch [Term] Cache deriving (Eq, Show)---- "memory" or "indexed"-data GeoFilterType = GeoFilterMemory-                   | GeoFilterIndexed deriving (Eq, Show)--data LatLon = LatLon { lat :: Double-                     , lon :: Double } deriving (Eq, Show)--data GeoBoundingBox =-  GeoBoundingBox { topLeft     :: LatLon-                 , bottomRight :: LatLon } deriving (Eq, Show)--data GeoBoundingBoxConstraint =-  GeoBoundingBoxConstraint { geoBBField        :: FieldName-                           , constraintBox     :: GeoBoundingBox-                           , bbConstraintcache :: Cache-                           , geoType           :: GeoFilterType-                           } deriving (Eq, Show)--data GeoPoint =-  GeoPoint { geoField :: FieldName-           , latLon   :: LatLon} deriving (Eq, Show)--data DistanceUnit = Miles-                  | Yards-                  | Feet-                  | Inches-                  | Kilometers-                  | Meters-                  | Centimeters-                  | Millimeters-                  | NauticalMiles deriving (Eq, Show)--data DistanceType = Arc-                  | SloppyArc -- doesn't exist <1.0-                  | Plane deriving (Eq, Show)--data OptimizeBbox = OptimizeGeoFilterType GeoFilterType-                  | NoOptimizeBbox deriving (Eq, Show)--data Distance =-  Distance { coefficient :: Double-           , unit        :: DistanceUnit } deriving (Eq, Show)--data DistanceRange =-  DistanceRange { distanceFrom :: Distance-                , distanceTo   :: Distance } deriving (Eq, Show)--data SearchResult a =-  SearchResult { took         :: Int-               , timedOut     :: Bool-               , shards       :: ShardResult-               , searchHits   :: SearchHits a-               , aggregations :: Maybe AggregationResults-               , scrollId     :: Maybe ScrollId } deriving (Eq, Show)--type ScrollId = Text  -- Fixme: Newtype--type Score = Maybe Double--data SearchHits a =-  SearchHits { hitsTotal :: Int-             , maxScore  :: Score-             , hits      :: [Hit a] } deriving (Eq, Show)---instance Monoid (SearchHits a) where-  mempty = SearchHits 0 Nothing mempty-  mappend (SearchHits ta ma ha) (SearchHits tb mb hb) =-    SearchHits (ta + tb) (max ma mb) (ha <> hb)---data Hit a =-  Hit { hitIndex     :: IndexName-      , hitType      :: MappingName-      , hitDocId     :: DocId-      , hitScore     :: Score-      , hitSource    :: Maybe a-      , hitHighlight :: Maybe HitHighlight } deriving (Eq, Show)--data ShardResult =-  ShardResult { shardTotal       :: Int-              , shardsSuccessful :: Int-              , shardsFailed     :: Int } deriving (Eq, Show, Generic)--type HitHighlight = M.Map Text [Text]--showText :: Show a => a -> Text-showText = T.pack . show--type Aggregations = M.Map Text Aggregation--emptyAggregations :: Aggregations-emptyAggregations = M.empty--mkAggregations :: Text -> Aggregation -> Aggregations-mkAggregations name aggregation = M.insert name aggregation emptyAggregations--data TermOrder = TermOrder{ termSortField :: Text-                          , termSortOrder :: SortOrder } deriving (Eq, Show)--data TermInclusion = TermInclusion Text-                   | TermPattern Text Text deriving (Eq, Show)--data CollectionMode = BreadthFirst-                    | DepthFirst deriving (Eq, Show)--data ExecutionHint = Ordinals-                   | GlobalOrdinals-                   | GlobalOrdinalsHash-                   | GlobalOrdinalsLowCardinality-                   | Map deriving (Eq, Show)--data TimeInterval = Weeks-                  | Days-                  | Hours-                  | Minutes-                  | Seconds deriving (Eq)--data Interval = Year-              | Quarter-              | Month-              | Week-              | Day-              | Hour-              | Minute-              | Second-              | FractionalInterval Float TimeInterval deriving (Eq, Show)--data Aggregation = TermsAgg TermsAggregation-                 | DateHistogramAgg DateHistogramAggregation-                 | ValueCountAgg ValueCountAggregation-                 | FilterAgg FilterAggregation deriving (Eq, Show)---data TermsAggregation = TermsAggregation { term              :: Either Text Text-                                         , termInclude       :: Maybe TermInclusion-                                         , termExclude       :: Maybe TermInclusion-                                         , termOrder         :: Maybe TermOrder-                                         , termMinDocCount   :: Maybe Int-                                         , termSize          :: Maybe Int-                                         , termShardSize     :: Maybe Int-                                         , termCollectMode   :: Maybe CollectionMode-                                         , termExecutionHint :: Maybe ExecutionHint-                                         , termAggs          :: Maybe Aggregations-                                    } deriving (Eq, Show)--data DateHistogramAggregation = DateHistogramAggregation { dateField      :: FieldName-                                                         , dateInterval   :: Interval-                                                         , dateFormat     :: Maybe Text-                                                         -- pre and post deprecated in 1.5-                                                         , datePreZone    :: Maybe Text-                                                         , datePostZone   :: Maybe Text-                                                         , datePreOffset  :: Maybe Text-                                                         , datePostOffset :: Maybe Text-                                                         , dateAggs       :: Maybe Aggregations-                                                         } deriving (Eq, Show)---- | See <https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html> for more information.-data ValueCountAggregation = FieldValueCount FieldName-                           | ScriptValueCount Script deriving (Eq, Show)---- | Single-bucket filter aggregations. See <https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html#search-aggregations-bucket-filter-aggregation> for more information.-data FilterAggregation = FilterAggregation { faFilter :: Filter-                                           , faAggs   :: Maybe Aggregations} deriving (Eq, Show)--mkTermsAggregation :: Text -> TermsAggregation-mkTermsAggregation t = TermsAggregation (Left t) Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing--mkTermsScriptAggregation :: Text -> TermsAggregation-mkTermsScriptAggregation t = TermsAggregation (Right t) Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing--mkDateHistogram :: FieldName -> Interval -> DateHistogramAggregation-mkDateHistogram t i = DateHistogramAggregation t i Nothing Nothing Nothing Nothing Nothing Nothing--instance ToJSON TermOrder where-  toJSON (TermOrder termSortField termSortOrder) = object [termSortField .= termSortOrder]--instance ToJSON TermInclusion where-  toJSON (TermInclusion x) = toJSON x-  toJSON (TermPattern pattern flags) = omitNulls [ "pattern" .= pattern,-                                                     "flags"   .= flags]--instance ToJSON CollectionMode where-  toJSON BreadthFirst = "breadth_first"-  toJSON DepthFirst   = "depth_first"--instance ToJSON ExecutionHint where-  toJSON Ordinals                     = "ordinals"-  toJSON GlobalOrdinals               = "global_ordinals"-  toJSON GlobalOrdinalsHash           = "global_ordinals_hash"-  toJSON GlobalOrdinalsLowCardinality = "global_ordinals_low_cardinality"-  toJSON Map                          = "map"--instance ToJSON Interval where-  toJSON Year = "year"-  toJSON Quarter = "quarter"-  toJSON Month = "month"-  toJSON Week = "week"-  toJSON Day = "day"-  toJSON Hour = "hour"-  toJSON Minute = "minute"-  toJSON Second = "second"-  toJSON (FractionalInterval fraction interval) = toJSON $ show fraction ++ show interval--instance Show TimeInterval where-  show Weeks    = "w"-  show Days     = "d"-  show Hours    = "h"-  show Minutes  = "m"-  show Seconds  = "s"--instance ToJSON Aggregation where-  toJSON (TermsAgg (TermsAggregation term include exclude order minDocCount size shardSize collectMode executionHint termAggs)) =-    omitNulls ["terms" .= omitNulls [ toJSON' term,-                                      "include"        .= include,-                                      "exclude"        .= exclude,-                                      "order"          .= order,-                                      "min_doc_count"  .= minDocCount,-                                      "size"           .= size,-                                      "shard_size"     .= shardSize,-                                      "collect_mode"   .= collectMode,-                                      "execution_hint" .= executionHint-                                    ],-               "aggs"  .= termAggs ]-    where-      toJSON' x = case x of { Left y -> "field" .= y;  Right y -> "script" .= y }--  toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =-    omitNulls ["date_histogram" .= omitNulls [ "field"       .= field,-                                               "interval"    .= interval,-                                               "format"      .= format,-                                               "pre_zone"    .= preZone,-                                               "post_zone"   .= postZone,-                                               "pre_offset"  .= preOffset,-                                               "post_offset" .= postOffset-                                             ],-               "aggs"           .= dateHistoAggs ]-  toJSON (ValueCountAgg a) = object ["value_count" .= v]-    where v = case a of-                (FieldValueCount (FieldName n)) -> object ["field" .= n]-                (ScriptValueCount (Script s))   -> object ["script" .= s]-  toJSON (FilterAgg (FilterAggregation filt ags)) =-    omitNulls [ "filter" .= filt-              , "aggs" .= ags]--type AggregationResults = M.Map Text Value--class BucketAggregation a where-  key :: a -> Text-  docCount :: a -> Int-  aggs :: a -> Maybe AggregationResults---data Bucket a = Bucket { buckets :: [a]} deriving (Show)--data TermsResult = TermsResult { termKey       :: Text-                               , termsDocCount :: Int-                               , termsAggs     :: Maybe AggregationResults } deriving (Show)--data DateHistogramResult = DateHistogramResult { dateKey           :: Int-                                               , dateKeyStr        :: Maybe Text-                                               , dateDocCount      :: Int-                                               , dateHistogramAggs :: Maybe AggregationResults } deriving (Show)--toTerms :: Text -> AggregationResults ->  Maybe (Bucket TermsResult)-toTerms t a = M.lookup t a >>= deserialize-  where deserialize = parseMaybe parseJSON--toDateHistogram :: Text -> AggregationResults -> Maybe (Bucket DateHistogramResult)-toDateHistogram t a = M.lookup t a >>= deserialize-  where deserialize = parseMaybe parseJSON--instance BucketAggregation TermsResult where-  key = termKey-  docCount = termsDocCount-  aggs = termsAggs--instance BucketAggregation DateHistogramResult where-  key = showText . dateKey-  docCount = dateDocCount-  aggs = dateHistogramAggs--instance (FromJSON a, BucketAggregation a) => FromJSON (Bucket a) where-  parseJSON (Object v) = Bucket <$>-                         v .: "buckets"-  parseJSON _ = mempty--instance FromJSON TermsResult where-  parseJSON (Object v) = TermsResult <$>-                         v .:   "key"       <*>-                         v .:   "doc_count" <*>-                         v .:?  "aggregations"-  parseJSON _ = mempty--instance FromJSON DateHistogramResult where-  parseJSON (Object v) = DateHistogramResult   <$>-                         v .:  "key"           <*>-                         v .:? "key_as_string" <*>-                         v .:  "doc_count"     <*>-                         v .:? "aggregations"-  parseJSON _ = mempty--instance Monoid Filter where-  mempty = IdentityFilter-  mappend a b = AndFilter [a, b] defaultCache--instance Seminearring Filter where-  a <||> b = OrFilter [a, b] defaultCache--instance ToJSON Filter where-  toJSON (AndFilter filters cache) =-    object ["and" .=-            object [ "filters" .= fmap toJSON filters-                   , "_cache"  .= cache]]--  toJSON (OrFilter filters cache) =-    object ["or" .=-            object [ "filters" .= fmap toJSON filters-                   , "_cache"  .= cache]]--  toJSON (NotFilter notFilter cache) =-    object ["not" .=-            object ["filter"  .= notFilter-                   , "_cache" .= cache]]--  toJSON (IdentityFilter) =-    object ["match_all" .= object []]--  toJSON (TermFilter (Term termFilterField termFilterValue) cache) =-    object ["term" .= object base]-    where base = [termFilterField .= termFilterValue,-                  "_cache"        .= cache]--  toJSON (ExistsFilter (FieldName fieldName)) =-    object ["exists"  .= object-            ["field"  .= fieldName]]--  toJSON (BoolFilter boolMatch) =-    object ["bool"    .= boolMatch]--  toJSON (GeoBoundingBoxFilter bbConstraint) =-    object ["geo_bounding_box" .= bbConstraint]--  toJSON (GeoDistanceFilter (GeoPoint (FieldName distanceGeoField) geoDistLatLon)-          distance distanceType optimizeBbox cache) =-    object ["geo_distance" .=-            object ["distance" .= distance-                   , "distance_type" .= distanceType-                   , "optimize_bbox" .= optimizeBbox-                   , distanceGeoField .= geoDistLatLon-                   , "_cache" .= cache]]--  toJSON (GeoDistanceRangeFilter (GeoPoint (FieldName gddrField) drLatLon)-          (DistanceRange geoDistRangeDistFrom drDistanceTo)) =-    object ["geo_distance_range" .=-            object ["from" .= geoDistRangeDistFrom-                   , "to"  .= drDistanceTo-                   , gddrField .= drLatLon]]--  toJSON (GeoPolygonFilter (FieldName geoPolygonFilterField) latLons) =-    object ["geo_polygon" .=-            object [geoPolygonFilterField .=-                    object ["points" .= fmap toJSON latLons]]]--  toJSON (IdsFilter (MappingName mappingName) values) =-    object ["ids" .=-            object ["type" .= mappingName-                   , "values" .= fmap unpackId values]]--  toJSON (LimitFilter limit) =-    object ["limit" .= object ["value" .= limit]]--  toJSON (MissingFilter (FieldName fieldName) (Existence existence) (NullValue nullValue)) =-    object ["missing" .=-            object ["field"       .= fieldName-                   , "existence"  .= existence-                   , "null_value" .= nullValue]]--  toJSON (PrefixFilter (FieldName fieldName) fieldValue cache) =-    object ["prefix" .=-            object [fieldName .= fieldValue-                   , "_cache" .= cache]]--  toJSON (QueryFilter query False) =-    object ["query" .= toJSON query ]-  toJSON (QueryFilter query True) =-    object ["fquery" .=-            object [ "query"  .= toJSON query-                   , "_cache" .= True ]]--  toJSON (RangeFilter (FieldName fieldName) rangeValue rangeExecution cache) =-    object ["range" .=-            object [ fieldName .= object (rangeValueToPair rangeValue)-                   , "execution" .= rangeExecution-                   , "_cache" .= cache]]--  toJSON (RegexpFilter (FieldName fieldName)-          (Regexp regexText) flags (CacheName cacheName) cache (CacheKey cacheKey)) =-    object ["regexp" .=-            object [fieldName .=-                    object ["value"  .= regexText-                           , "flags" .= flags]-                   , "_name"      .= cacheName-                   , "_cache"     .= cache-                   , "_cache_key" .= cacheKey]]--instance ToJSON GeoPoint where-  toJSON (GeoPoint (FieldName geoPointField) geoPointLatLon) =-    object [ geoPointField  .= geoPointLatLon ]---instance ToJSON Query where-  toJSON (TermQuery (Term termQueryField termQueryValue) boost) =-    object [ "term" .=-             object [termQueryField .= object merged]]-    where-      base = [ "value" .= termQueryValue ]-      boosted = maybe [] (return . ("boost" .=)) boost-      merged = mappend base boosted--  toJSON (TermsQuery terms) =-    object [ "terms" .= object conjoined ]-    where conjoined = [ getTermsField terms .=-                        fmap (toJSON . getTermValue) (toList terms)]-          getTermsField ((Term f _ ) :| _) = f-          getTermValue (Term _ v) = v-  toJSON (IdsQuery idsQueryMappingName docIds) =-    object [ "ids" .= object conjoined ]-    where conjoined = [ "type"   .= idsQueryMappingName-                      , "values" .= fmap toJSON docIds ]--  toJSON (QueryQueryStringQuery qQueryStringQuery) =-    object [ "query_string" .= qQueryStringQuery ]--  toJSON (QueryMatchQuery matchQuery) =-    object [ "match" .= matchQuery ]--  toJSON (QueryMultiMatchQuery multiMatchQuery) =-      toJSON multiMatchQuery--  toJSON (QueryBoolQuery boolQuery) =-    object [ "bool" .= boolQuery ]--  toJSON (QueryBoostingQuery boostingQuery) =-    object [ "boosting" .= boostingQuery ]--  toJSON (QueryCommonTermsQuery commonTermsQuery) =-    object [ "common" .= commonTermsQuery ]--  toJSON (ConstantScoreFilter csFilter boost) =-    object [ "constant_score" .= csFilter-           , "boost" .= boost]--  toJSON (ConstantScoreQuery query boost) =-    object [ "constant_score" .= query-           , "boost"          .= boost]--  toJSON (QueryDisMaxQuery disMaxQuery) =-    object [ "dis_max" .= disMaxQuery ]--  toJSON (QueryFilteredQuery qFilteredQuery) =-    object [ "filtered" .= qFilteredQuery ]--  toJSON (QueryFuzzyLikeThisQuery fuzzyQuery) =-    object [ "fuzzy_like_this" .= fuzzyQuery ]--  toJSON (QueryFuzzyLikeFieldQuery fuzzyFieldQuery) =-    object [ "fuzzy_like_this_field" .= fuzzyFieldQuery ]--  toJSON (QueryFuzzyQuery fuzzyQuery) =-    object [ "fuzzy" .= fuzzyQuery ]--  toJSON (QueryHasChildQuery childQuery) =-    object [ "has_child" .= childQuery ]--  toJSON (QueryHasParentQuery parentQuery) =-    object [ "has_parent" .= parentQuery ]--  toJSON (QueryIndicesQuery qIndicesQuery) =-    object [ "indices" .= qIndicesQuery ]--  toJSON (MatchAllQuery boost) =-    object [ "match_all" .= omitNulls [ "boost" .= boost ] ]--  toJSON (QueryMoreLikeThisQuery query) =-    object [ "more_like_this" .= query ]--  toJSON (QueryMoreLikeThisFieldQuery query) =-    object [ "more_like_this_field" .= query ]--  toJSON (QueryNestedQuery query) =-    object [ "nested" .= query ]--  toJSON (QueryPrefixQuery query) =-    object [ "prefix" .= query ]--  toJSON (QueryRangeQuery query) =-    object [ "range"  .= query ]--  toJSON (QueryRegexpQuery query) =-    object [ "regexp" .= query ]--  toJSON (QuerySimpleQueryStringQuery query) =-    object [ "simple_query_string" .= query ]---omitNulls :: [(Text, Value)] -> Value-omitNulls = object . filter notNull where-  notNull (_, Null)      = False-  notNull (_, Array a) = (not . V.null) a-  notNull _              = True---instance ToJSON SimpleQueryStringQuery where-  toJSON SimpleQueryStringQuery {..} =-    omitNulls (base ++ maybeAdd)-    where base = [ "query" .= simpleQueryStringQuery ]-          maybeAdd = [ "fields" .= simpleQueryStringField-                     , "default_operator" .= simpleQueryStringOperator-                     , "analyzer" .= simpleQueryStringAnalyzer-                     , "flags" .= simpleQueryStringFlags-                     , "lowercase_expanded_terms" .= simpleQueryStringLowercaseExpanded-                     , "locale" .= simpleQueryStringLocale ]---instance ToJSON FieldOrFields where-  toJSON (FofField fieldName) =-    toJSON fieldName-  toJSON (FofFields fieldNames) =-    toJSON fieldNames--instance ToJSON SimpleQueryFlag where-  toJSON SimpleQueryAll        = "ALL"-  toJSON SimpleQueryNone       = "NONE"-  toJSON SimpleQueryAnd        = "AND"-  toJSON SimpleQueryOr         = "OR"-  toJSON SimpleQueryPrefix     = "PREFIX"-  toJSON SimpleQueryPhrase     = "PHRASE"-  toJSON SimpleQueryPrecedence = "PRECEDENCE"-  toJSON SimpleQueryEscape     = "ESCAPE"-  toJSON SimpleQueryWhitespace = "WHITESPACE"-  toJSON SimpleQueryFuzzy      = "FUZZY"-  toJSON SimpleQueryNear       = "NEAR"-  toJSON SimpleQuerySlop       = "SLOP"---instance ToJSON RegexpQuery where-  toJSON (RegexpQuery (FieldName rqQueryField)-          (Regexp regexpQueryQuery) rqQueryFlags-          rqQueryBoost) =-   object [ rqQueryField .= omitNulls base ]-   where base = [ "value" .= regexpQueryQuery-                , "flags" .= rqQueryFlags-                , "boost" .= rqQueryBoost ]---instance ToJSON QueryStringQuery where-  toJSON (QueryStringQuery qsQueryString-          qsDefaultField qsOperator-          qsAnalyzer qsAllowWildcard-          qsLowercaseExpanded  qsEnablePositionIncrements-          qsFuzzyMaxExpansions qsFuzziness-          qsFuzzyPrefixLength qsPhraseSlop-          qsBoost qsAnalyzeWildcard-          qsGeneratePhraseQueries qsMinimumShouldMatch-          qsLenient qsLocale) =-    omitNulls base-    where-      base = [ "query" .= qsQueryString-             , "default_field" .= qsDefaultField-             , "default_operator" .= qsOperator-             , "analyzer" .= qsAnalyzer-             , "allow_leading_wildcard" .= qsAllowWildcard-             , "lowercase_expanded_terms" .= qsLowercaseExpanded-             , "enable_position_increments" .= qsEnablePositionIncrements-             , "fuzzy_max_expansions" .= qsFuzzyMaxExpansions-             , "fuzziness" .= qsFuzziness-             , "fuzzy_prefix_length" .= qsFuzzyPrefixLength-             , "phrase_slop" .= qsPhraseSlop-             , "boost" .= qsBoost-             , "analyze_wildcard" .= qsAnalyzeWildcard-             , "auto_generate_phrase_queries" .= qsGeneratePhraseQueries-             , "minimum_should_match" .= qsMinimumShouldMatch-             , "lenient" .= qsLenient-             , "locale" .= qsLocale ]---instance ToJSON RangeQuery where-  toJSON (RangeQuery (FieldName fieldName) range boost) =-    object [ fieldName .= conjoined ]-    where conjoined = [ "boost" .= boost ] ++ (rangeValueToPair range)---instance ToJSON PrefixQuery where-  toJSON (PrefixQuery (FieldName fieldName) queryValue boost) =-    object [ fieldName .= omitNulls base ]-    where base = [ "value" .= queryValue-                 , "boost" .= boost ]---instance ToJSON NestedQuery where-  toJSON (NestedQuery nqPath nqScoreType nqQuery) =-    object [ "path"       .= nqPath-           , "score_mode" .= nqScoreType-           , "query"      .= nqQuery ]---instance ToJSON MoreLikeThisFieldQuery where-  toJSON (MoreLikeThisFieldQuery text (FieldName fieldName)-          percent mtf mqt stopwords mindf maxdf-          minwl maxwl boostTerms boost analyzer) =-    object [ fieldName .= omitNulls base ]-    where base = [ "like_text" .= text-                 , "percent_terms_to_match" .= percent-                 , "min_term_freq" .= mtf-                 , "max_query_terms" .= mqt-                 , "stop_words" .= stopwords-                 , "min_doc_freq" .= mindf-                 , "max_doc_freq" .= maxdf-                 , "min_word_length" .= minwl-                 , "max_word_length" .= maxwl-                 , "boost_terms" .= boostTerms-                 , "boost" .= boost-                 , "analyzer" .= analyzer ]---instance ToJSON MoreLikeThisQuery where-  toJSON (MoreLikeThisQuery text fields percent-          mtf mqt stopwords mindf maxdf-          minwl maxwl boostTerms boost analyzer) =-    omitNulls base-    where base = [ "like_text" .= text-                 , "fields" .= fields-                 , "percent_terms_to_match" .= percent-                 , "min_term_freq" .= mtf-                 , "max_query_terms" .= mqt-                 , "stop_words" .= stopwords-                 , "min_doc_freq" .= mindf-                 , "max_doc_freq" .= maxdf-                 , "min_word_length" .= minwl-                 , "max_word_length" .= maxwl-                 , "boost_terms" .= boostTerms-                 , "boost" .= boost-                 , "analyzer" .= analyzer ]---instance ToJSON IndicesQuery where-  toJSON (IndicesQuery indices query noMatch) =-    omitNulls [ "indices" .= indices-              , "no_match_query" .= noMatch-              , "query" .= query ]---instance ToJSON HasParentQuery where-  toJSON (HasParentQuery queryType query scoreType) =-    omitNulls [ "parent_type" .= queryType-              , "score_type" .= scoreType-              , "query" .= query ]---instance ToJSON HasChildQuery where-  toJSON (HasChildQuery queryType query scoreType) =-    omitNulls [ "query" .= query-              , "score_type" .= scoreType-              , "type"  .= queryType ]---instance ToJSON FuzzyQuery where-  toJSON (FuzzyQuery (FieldName fieldName) queryText-          prefixLength maxEx fuzziness boost) =-    object [ fieldName .= omitNulls base ]-    where base = [ "value"          .= queryText-                 , "fuzziness"      .= fuzziness-                 , "prefix_length"  .= prefixLength-                 , "boost" .= boost-                 , "max_expansions" .= maxEx ]---instance ToJSON FuzzyLikeFieldQuery where-  toJSON (FuzzyLikeFieldQuery (FieldName fieldName)-          fieldText maxTerms ignoreFreq fuzziness prefixLength-          boost analyzer) =-    object [ fieldName .=-             omitNulls [ "like_text"       .= fieldText-                       , "max_query_terms" .= maxTerms-                       , "ignore_tf"       .= ignoreFreq-                       , "fuzziness"       .= fuzziness-                       , "prefix_length"   .= prefixLength-                       , "analyzer" .= analyzer-                       , "boost"           .= boost ]]---instance ToJSON FuzzyLikeThisQuery where-  toJSON (FuzzyLikeThisQuery fields text maxTerms-          ignoreFreq fuzziness prefixLength boost analyzer) =-    omitNulls base-    where base = [ "fields"          .= fields-                 , "like_text"       .= text-                 , "max_query_terms" .= maxTerms-                 , "ignore_tf"       .= ignoreFreq-                 , "fuzziness"       .= fuzziness-                 , "prefix_length"   .= prefixLength-                 , "analyzer"        .= analyzer-                 , "boost"           .= boost ]---instance ToJSON FilteredQuery where-  toJSON (FilteredQuery query fFilter) =-    object [ "query"  .= query-           , "filter" .= fFilter ]---instance ToJSON DisMaxQuery where-  toJSON (DisMaxQuery queries tiebreaker boost) =-    omitNulls base-    where base = [ "queries"     .= queries-                 , "boost"       .= boost-                 , "tie_breaker" .= tiebreaker ]---instance ToJSON CommonTermsQuery where-  toJSON (CommonTermsQuery (FieldName fieldName)-          (QueryString query) cf lfo hfo msm-          boost analyzer disableCoord) =-    object [fieldName .= omitNulls base ]-    where base = [ "query"              .= query-                 , "cutoff_frequency"   .= cf-                 , "low_freq_operator"  .= lfo-                 , "minimum_should_match" .= msm-                 , "boost" .= boost-                 , "analyzer" .= analyzer-                 , "disable_coord" .= disableCoord-                 , "high_freq_operator" .= hfo ]---instance ToJSON CommonMinimumMatch where-  toJSON (CommonMinimumMatch mm) = toJSON mm-  toJSON (CommonMinimumMatchHighLow (MinimumMatchHighLow lowF highF)) =-    object [ "low_freq"  .= lowF-           , "high_freq" .= highF ]--instance ToJSON BoostingQuery where-  toJSON (BoostingQuery bqPositiveQuery bqNegativeQuery bqNegativeBoost) =-    object [ "positive"       .= bqPositiveQuery-           , "negative"       .= bqNegativeQuery-           , "negative_boost" .= bqNegativeBoost ]---instance ToJSON BoolQuery where-  toJSON (BoolQuery mustM notM shouldM bqMin boost disableCoord) =-    omitNulls base-    where base = [ "must" .= mustM-                 , "must_not" .= notM-                 , "should" .= shouldM-                 , "minimum_should_match" .= bqMin-                 , "boost" .= boost-                 , "disable_coord" .= disableCoord ]---instance ToJSON MatchQuery where-  toJSON (MatchQuery (FieldName fieldName)-          (QueryString mqQueryString) booleanOperator-          zeroTermsQuery cutoffFrequency matchQueryType-          analyzer maxExpansions lenient boost) =-    object [ fieldName .= omitNulls base ]-    where base = [ "query" .= mqQueryString-                 , "operator" .= booleanOperator-                 , "zero_terms_query" .= zeroTermsQuery-                 , "cutoff_frequency" .= cutoffFrequency-                 , "type" .= matchQueryType-                 , "analyzer" .= analyzer-                 , "max_expansions" .= maxExpansions-                 , "lenient" .= lenient-                 , "boost" .= boost ]---instance ToJSON MultiMatchQuery where-  toJSON (MultiMatchQuery fields (QueryString query) boolOp-          ztQ tb mmqt cf analyzer maxEx lenient) =-    object ["multi_match" .= omitNulls base]-    where base = [ "fields" .= fmap toJSON fields-                 , "query" .= query-                 , "operator" .= boolOp-                 , "zero_terms_query" .= ztQ-                 , "tiebreaker" .= tb-                 , "type" .= mmqt-                 , "cutoff_frequency" .= cf-                 , "analyzer" .= analyzer-                 , "max_expansions" .= maxEx-                 , "lenient" .= lenient ]---instance ToJSON MultiMatchQueryType where-  toJSON MultiMatchBestFields = "best_fields"-  toJSON MultiMatchMostFields = "most_fields"-  toJSON MultiMatchCrossFields = "cross_fields"-  toJSON MultiMatchPhrase = "phrase"-  toJSON MultiMatchPhrasePrefix = "phrase_prefix"--instance ToJSON BooleanOperator where-  toJSON And = String "and"-  toJSON Or = String "or"--instance ToJSON ZeroTermsQuery where-  toJSON ZeroTermsNone = String "none"-  toJSON ZeroTermsAll  = String "all"--instance ToJSON MatchQueryType where-  toJSON MatchPhrase = "phrase"-  toJSON MatchPhrasePrefix = "phrase_prefix"--instance ToJSON FieldName where-  toJSON (FieldName fieldName) = String fieldName--instance ToJSON ReplicaCount-instance ToJSON ShardCount-instance ToJSON CutoffFrequency-instance ToJSON Analyzer-instance ToJSON MaxExpansions-instance ToJSON Lenient-instance ToJSON Boost-instance ToJSON Version-instance ToJSON Tiebreaker-instance ToJSON MinimumMatch-instance ToJSON DisableCoord-instance ToJSON PrefixLength-instance ToJSON Fuzziness-instance ToJSON IgnoreTermFrequency-instance ToJSON MaxQueryTerms-instance ToJSON TypeName-instance ToJSON IndexName-instance ToJSON TemplateName-instance ToJSON TemplatePattern-instance ToJSON BoostTerms-instance ToJSON MaxWordLength-instance ToJSON MinWordLength-instance ToJSON MaxDocFrequency-instance ToJSON MinDocFrequency-instance ToJSON PhraseSlop-instance ToJSON StopWord-instance ToJSON QueryPath-instance ToJSON MinimumTermFrequency-instance ToJSON PercentMatch-instance ToJSON MappingName-instance ToJSON DocId-instance ToJSON QueryString-instance ToJSON AllowLeadingWildcard-instance ToJSON LowercaseExpanded-instance ToJSON AnalyzeWildcard-instance ToJSON GeneratePhraseQueries-instance ToJSON Locale-instance ToJSON EnablePositionIncrements-instance FromJSON Version-instance FromJSON IndexName-instance FromJSON MappingName-instance FromJSON DocId---instance FromJSON Status where-  parseJSON (Object v) = Status <$>-                         v .:? "ok" <*>-                         v .: "status" <*>-                         v .: "name" <*>-                         v .: "version" <*>-                         v .: "tagline"-  parseJSON _          = empty---instance ToJSON IndexSettings where-  toJSON (IndexSettings s r) = object ["settings" .=-                                 object ["index" .=-                                   object ["number_of_shards" .= s, "number_of_replicas" .= r]-                                 ]-                               ]--instance ToJSON IndexTemplate where-  toJSON (IndexTemplate p s m) = merge-    (object [ "template" .= p-            , "mappings" .= foldl' merge (object []) m-            ])-    (toJSON s)-   where-     merge (Object o1) (Object o2) = toJSON $ HM.union o1 o2-     merge o           Null        = o-     merge _           _           = undefined--instance (FromJSON a) => FromJSON (EsResult a) where-  parseJSON jsonVal@(Object v) = do-    found <- v .:? "found" .!= False-    fr <- if found-             then parseJSON jsonVal-             else return Nothing-    EsResult <$> v .:  "_index"   <*>-                 v .:  "_type"    <*>-                 v .:  "_id"      <*>-                 pure fr-  parseJSON _          = empty--instance (FromJSON a) => FromJSON (EsResultFound a) where-  parseJSON (Object v) = EsResultFound <$>-                         v .: "_version" <*>-                         v .: "_source"-  parseJSON _          = empty--instance FromJSON EsError where-  parseJSON (Object v) = EsError <$>-                         v .: "status" <*>-                         v .: "error"-  parseJSON _ = empty--instance ToJSON Search where-  toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize _ sFields sSource) =-    omitNulls [ "query"        .= query-              , "filter"       .= sFilter-              , "sort"         .= sort-              , "aggregations" .= searchAggs-              , "highlight"    .= highlight-              , "from"         .= sFrom-              , "size"         .= sSize-              , "track_scores" .= sTrackSortScores-              , "fields"       .= sFields-              , "_source"      .= sSource]---instance ToJSON Source where-    toJSON NoSource                         = toJSON False-    toJSON (SourcePatterns patterns)        = toJSON patterns-    toJSON (SourceIncludeExclude incl excl) = object [ "include" .= incl, "exclude" .= excl ]--instance ToJSON PatternOrPatterns where-  toJSON (PopPattern pattern)   = toJSON pattern-  toJSON (PopPatterns patterns) = toJSON patterns--instance ToJSON Include where-  toJSON (Include patterns) = toJSON patterns--instance ToJSON Exclude where-  toJSON (Exclude patterns) = toJSON patterns--instance ToJSON Pattern where-  toJSON (Pattern pattern) = toJSON pattern---instance ToJSON FieldHighlight where-    toJSON (FieldHighlight (FieldName fName) (Just fSettings)) =-        object [ fName .= fSettings ]-    toJSON (FieldHighlight (FieldName fName) Nothing) =-        object [ fName .= emptyObject ]--instance ToJSON Highlights where-    toJSON (Highlights global fields) =-        omitNulls (("fields" .= fields)-                  : highlightSettingsPairs global)--instance ToJSON HighlightSettings where-    toJSON hs = omitNulls (highlightSettingsPairs (Just hs))--highlightSettingsPairs :: Maybe HighlightSettings -> [Pair]-highlightSettingsPairs Nothing = []-highlightSettingsPairs (Just (Plain plh)) = plainHighPairs (Just plh)-highlightSettingsPairs (Just (Postings ph)) = postHighPairs (Just ph)-highlightSettingsPairs (Just (FastVector fvh)) = fastVectorHighPairs (Just fvh)---plainHighPairs :: Maybe PlainHighlight -> [Pair]-plainHighPairs Nothing = []-plainHighPairs (Just (PlainHighlight plCom plNonPost)) =-    [ "type" .= String "plain"]-    ++ commonHighlightPairs plCom-    ++ nonPostingsToPairs plNonPost--postHighPairs :: Maybe PostingsHighlight -> [Pair]-postHighPairs Nothing = []-postHighPairs (Just (PostingsHighlight pCom)) =-    ("type" .= String "postings")-    : commonHighlightPairs pCom--fastVectorHighPairs :: Maybe FastVectorHighlight -> [Pair]-fastVectorHighPairs Nothing = []-fastVectorHighPairs (Just-                     (FastVectorHighlight fvCom fvNonPostSettings fvBoundChars-                                          fvBoundMaxScan fvFragOff fvMatchedFields-                                          fvPhraseLim)) =-                        [ "type" .= String "fvh"-                        , "boundary_chars" .= fvBoundChars-                        , "boundary_max_scan" .= fvBoundMaxScan-                        , "fragment_offset" .= fvFragOff-                        , "matched_fields" .= fvMatchedFields-                        , "phraseLimit" .= fvPhraseLim]-                        ++ commonHighlightPairs fvCom-                        ++ nonPostingsToPairs fvNonPostSettings--commonHighlightPairs :: Maybe CommonHighlight -> [Pair]-commonHighlightPairs Nothing = []-commonHighlightPairs (Just (CommonHighlight chScore chForceSource chTag chEncoder-                                      chNoMatchSize chHighlightQuery-                                      chRequireFieldMatch)) =-    [ "order" .= chScore-    , "force_source" .= chForceSource-    , "encoder" .= chEncoder-    , "no_match_size" .= chNoMatchSize-    , "highlight_query" .= chHighlightQuery-    , "require_fieldMatch" .= chRequireFieldMatch]-    ++ highlightTagToPairs chTag---nonPostingsToPairs :: Maybe NonPostings -> [Pair]-nonPostingsToPairs Nothing = []-nonPostingsToPairs (Just (NonPostings npFragSize npNumOfFrags)) =-    [ "fragment_size" .= npFragSize-    , "number_of_fragments" .= npNumOfFrags]----instance ToJSON HighlightEncoder where-    toJSON DefaultEncoder = String "default"-    toJSON HTMLEncoder    = String "html"--highlightTagToPairs :: Maybe HighlightTag -> [Pair]-highlightTagToPairs (Just (TagSchema _))            = [ "scheme"    .=  String "default"]-highlightTagToPairs (Just (CustomTags (pre, post))) = [ "pre_tags"  .= pre-                                                      , "post_tags" .= post]-highlightTagToPairs Nothing = []--instance ToJSON SortSpec where-  toJSON (DefaultSortSpec-          (DefaultSort (FieldName dsSortFieldName) dsSortOrder dsIgnoreUnmapped-           dsSortMode dsMissingSort dsNestedFilter)) =-    object [dsSortFieldName .= omitNulls base] where-      base = [ "order" .= dsSortOrder-             , "ignore_unmapped" .= dsIgnoreUnmapped-             , "mode" .= dsSortMode-             , "missing" .= dsMissingSort-             , "nested_filter" .= dsNestedFilter ]--  toJSON (GeoDistanceSortSpec gdsSortOrder (GeoPoint (FieldName field) gdsLatLon) units) =-    object [ "unit" .= units-           , field .= gdsLatLon-           , "order" .= gdsSortOrder ]---instance ToJSON SortOrder where-  toJSON Ascending  = String "asc"-  toJSON Descending = String "desc"---instance ToJSON SortMode where-  toJSON SortMin = String "min"-  toJSON SortMax = String "max"-  toJSON SortSum = String "sum"-  toJSON SortAvg = String "avg"---instance ToJSON Missing where-  toJSON LastMissing = String "_last"-  toJSON FirstMissing = String "_first"-  toJSON (CustomMissing txt) = String txt---instance ToJSON ScoreType where-  toJSON ScoreTypeMax  = "max"-  toJSON ScoreTypeAvg  = "avg"-  toJSON ScoreTypeSum  = "sum"-  toJSON ScoreTypeNone = "none"---instance ToJSON Distance where-  toJSON (Distance dCoefficient dUnit) =-    String boltedTogether where-      coefText = showText dCoefficient-      (String unitText) = toJSON dUnit-      boltedTogether = mappend coefText unitText---instance ToJSON DistanceUnit where-  toJSON Miles         = String "mi"-  toJSON Yards         = String "yd"-  toJSON Feet          = String "ft"-  toJSON Inches        = String "in"-  toJSON Kilometers    = String "km"-  toJSON Meters        = String "m"-  toJSON Centimeters   = String "cm"-  toJSON Millimeters   = String "mm"-  toJSON NauticalMiles = String "nmi"---instance ToJSON DistanceType where-  toJSON Arc       = String "arc"-  toJSON SloppyArc = String "sloppy_arc"-  toJSON Plane     = String "plane"---instance ToJSON OptimizeBbox where-  toJSON NoOptimizeBbox = String "none"-  toJSON (OptimizeGeoFilterType gft) = toJSON gft---instance ToJSON GeoBoundingBoxConstraint where-  toJSON (GeoBoundingBoxConstraint-          (FieldName gbbcGeoBBField) gbbcConstraintBox cache type') =-    object [gbbcGeoBBField .= gbbcConstraintBox-           , "_cache"  .= cache-           , "type" .= type']---instance ToJSON GeoFilterType where-  toJSON GeoFilterMemory  = String "memory"-  toJSON GeoFilterIndexed = String "indexed"---instance ToJSON GeoBoundingBox where-  toJSON (GeoBoundingBox gbbTopLeft gbbBottomRight) =-    object ["top_left"      .= gbbTopLeft-           , "bottom_right" .= gbbBottomRight]---instance ToJSON LatLon where-  toJSON (LatLon lLat lLon) =-    object ["lat"  .= lLat-           , "lon" .= lLon]----- index for smaller ranges, fielddata for longer ranges-instance ToJSON RangeExecution where-  toJSON RangeExecutionIndex     = "index"-  toJSON RangeExecutionFielddata = "fielddata"---instance ToJSON RegexpFlags where-  toJSON AllRegexpFlags              = String "ALL"-  toJSON NoRegexpFlags               = String "NONE"-  toJSON (SomeRegexpFlags (h :| fs)) = String $ T.intercalate "|" flagStrs-    where flagStrs             = map flagStr . nub $ h:fs-          flagStr AnyString    = "ANYSTRING"-          flagStr Automaton    = "AUTOMATON"-          flagStr Complement   = "COMPLEMENT"-          flagStr Empty        = "EMPTY"-          flagStr Intersection = "INTERSECTION"-          flagStr Interval     = "INTERVAL"--instance ToJSON Term where-  toJSON (Term field value) = object ["term" .= object-                                      [field .= value]]---instance ToJSON BoolMatch where-  toJSON (MustMatch    term  cache) = object ["must"     .= term,-                                              "_cache" .= cache]-  toJSON (MustNotMatch term  cache) = object ["must_not" .= term,-                                              "_cache" .= cache]-  toJSON (ShouldMatch  terms cache) = object ["should"   .= fmap toJSON terms,-                                              "_cache" .= cache]---instance (FromJSON a) => FromJSON (SearchResult a) where-  parseJSON (Object v) = SearchResult <$>-                         v .:  "took"         <*>-                         v .:  "timed_out"    <*>-                         v .:  "_shards"      <*>-                         v .:  "hits"         <*>-                         v .:? "aggregations" <*>-                         v .:? "_scroll_id"-  parseJSON _          = empty--instance (FromJSON a) => FromJSON (SearchHits a) where-  parseJSON (Object v) = SearchHits <$>-                         v .: "total"     <*>-                         v .: "max_score" <*>-                         v .: "hits"-  parseJSON _          = empty--instance (FromJSON a) => FromJSON (Hit a) where-  parseJSON (Object v) = Hit <$>-                         v .:  "_index"   <*>-                         v .:  "_type"    <*>-                         v .:  "_id"      <*>-                         v .:  "_score"   <*>-                         v .:?  "_source" <*>-                         v .:? "highlight"-  parseJSON _          = empty--instance FromJSON ShardResult where-  parseJSON (Object v) = ShardResult       <$>-                         v .: "total"      <*>-                         v .: "successful" <*>-                         v .: "failed"-  parseJSON _          = empty---instance FromJSON DocVersion where-  parseJSON v = do-    i <- parseJSON v-    maybe (fail "DocVersion out of range") return $ mkDocVersion i+{-# LANGUAGE DeriveDataTypeable         #-}+{-# LANGUAGE DeriveGeneric              #-}+{-# LANGUAGE FlexibleContexts           #-}+{-# LANGUAGE FlexibleInstances          #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses      #-}+{-# LANGUAGE NoMonomorphismRestriction  #-}+{-# LANGUAGE OverloadedStrings          #-}+{-# LANGUAGE RecordWildCards            #-}+{-# LANGUAGE UndecidableInstances       #-}++-------------------------------------------------------------------------------+-- |+-- Module : Database.Bloodhound.Types+-- Copyright : (C) 2014 Chris Allen+-- License : BSD-style (see the file LICENSE)+-- Maintainer : Chris Allen <cma@bitemyapp.com+-- Stability : provisional+-- Portability : DeriveGeneric, RecordWildCards+--+-- Data types for describing actions and data structures performed to interact+-- with Elasticsearch. The two main buckets your queries against Elasticsearch+-- will fall into are 'Query's and 'Filter's. 'Filter's are more like+-- traditional database constraints and often have preferable performance+-- properties. 'Query's support human-written textual queries, such as fuzzy+-- queries.+-------------------------------------------------------------------------------++++module Database.Bloodhound.Types+       ( defaultCache+       , defaultIndexSettings+       , defaultIndexDocumentSettings+       , mkSort+       , showText+       , unpackId+       , mkMatchQuery+       , mkMultiMatchQuery+       , mkBoolQuery+       , mkRangeQuery+       , mkQueryStringQuery+       , mkAggregations+       , mkTermsAggregation+       , mkTermsScriptAggregation+       , mkDateHistogram+       , mkDocVersion+       , docVersionNumber+       , toTerms+       , toDateHistogram+       , omitNulls+       , BH(..)+       , runBH+       , BHEnv(..)+       , MonadBH(..)+       , Version(..)+       , Status(..)+       , Existence(..)+       , NullValue(..)+       , IndexSettings(..)+       , UpdatableIndexSetting(..)+       , IndexSettingsSummary(..)+       , AllocationPolicy(..)+       , ReplicaBounds(..)+       , Bytes(..)+       , FSType(..)+       , InitialShardCount(..)+       , NodeAttrFilter(..)+       , NodeAttrName(..)+       , CompoundFormat(..)+       , IndexTemplate(..)+       , Server(..)+       , Reply+       , EsResult(..)+       , EsResultFound(..)+       , EsError(..)+       , EsProtocolException(..)+       , IndexAlias(..)+       , IndexAliasName(..)+       , IndexAliasAction(..)+       , IndexAliasCreate(..)+       , IndexAliasSummary(..)+       , IndexAliasesSummary(..)+       , AliasRouting(..)+       , SearchAliasRouting(..)+       , IndexAliasRouting(..)+       , RoutingValue(..)+       , DocVersion+       , ExternalDocVersion(..)+       , VersionControl(..)+       , DocumentParent(..)+       , IndexDocumentSettings(..)+       , Query(..)+       , Search(..)+       , SearchType(..)+       , SearchResult(..)+       , ScrollId(..)+       , SearchHits(..)+       , TrackSortScores+       , From(..)+       , Size(..)+       , Source(..)+       , PatternOrPatterns(..)+       , Include(..)+       , Exclude(..)+       , Pattern(..)+       , ShardResult(..)+       , Hit(..)+       , Filter(..)+       , Seminearring(..)+       , BoolMatch(..)+       , Term(..)+       , GeoPoint(..)+       , GeoBoundingBoxConstraint(..)+       , GeoBoundingBox(..)+       , GeoFilterType(..)+       , Distance(..)+       , DistanceUnit(..)+       , DistanceType(..)+       , DistanceRange(..)+       , OptimizeBbox(..)+       , LatLon(..)+       , RangeValue(..)+       , RangeExecution(..)+       , LessThan(..)+       , LessThanEq(..)+       , GreaterThan(..)+       , GreaterThanEq(..)+       , LessThanD(..)+       , LessThanEqD(..)+       , GreaterThanD(..)+       , GreaterThanEqD(..)+       , Regexp(..)+       , RegexpFlags(..)+       , RegexpFlag(..)+       , FieldName(..)+       , Script(..)+       , IndexName(..)+       , TemplateName(..)+       , TemplatePattern(..)+       , MappingName(..)+       , DocId(..)+       , CacheName(..)+       , CacheKey(..)+       , BulkOperation(..)+       , ReplicaCount(..)+       , ShardCount(..)+       , Sort+       , SortMode(..)+       , SortOrder(..)+       , SortSpec(..)+       , DefaultSort(..)+       , Missing(..)+       , OpenCloseIndex(..)+       , Method+       , Boost(..)+       , MatchQuery(..)+       , MultiMatchQuery(..)+       , BoolQuery(..)+       , BoostingQuery(..)+       , CommonTermsQuery(..)+       , DisMaxQuery(..)+       , FilteredQuery(..)+       , FuzzyLikeThisQuery(..)+       , FuzzyLikeFieldQuery(..)+       , FuzzyQuery(..)+       , HasChildQuery(..)+       , HasParentQuery(..)+       , IndicesQuery(..)+       , MoreLikeThisQuery(..)+       , MoreLikeThisFieldQuery(..)+       , NestedQuery(..)+       , PrefixQuery(..)+       , QueryStringQuery(..)+       , SimpleQueryStringQuery(..)+       , RangeQuery(..)+       , RegexpQuery(..)+       , QueryString(..)+       , BooleanOperator(..)+       , ZeroTermsQuery(..)+       , CutoffFrequency(..)+       , Analyzer(..)+       , MaxExpansions(..)+       , Lenient(..)+       , MatchQueryType(..)+       , MultiMatchQueryType(..)+       , Tiebreaker(..)+       , MinimumMatch(..)+       , DisableCoord(..)+       , CommonMinimumMatch(..)+       , MinimumMatchHighLow(..)+       , PrefixLength(..)+       , Fuzziness(..)+       , IgnoreTermFrequency(..)+       , MaxQueryTerms(..)+       , ScoreType(..)+       , Score+       , Cache+       , TypeName(..)+       , BoostTerms(..)+       , MaxWordLength(..)+       , MinWordLength(..)+       , MaxDocFrequency(..)+       , MinDocFrequency(..)+       , PhraseSlop(..)+       , StopWord(..)+       , QueryPath(..)+       , MinimumTermFrequency(..)+       , PercentMatch(..)+       , FieldDefinition(..)+       , MappingField(..)+       , Mapping(..)+       , AllowLeadingWildcard(..)+       , LowercaseExpanded(..)+       , GeneratePhraseQueries(..)+       , Locale(..)+       , AnalyzeWildcard(..)+       , EnablePositionIncrements(..)+       , SimpleQueryFlag(..)+       , FieldOrFields(..)+       , Monoid(..)+       , ToJSON(..)+       , Interval(..)+       , TimeInterval(..)+       , ExecutionHint(..)+       , CollectionMode(..)+       , TermOrder(..)+       , TermInclusion(..)++       , Aggregation(..)+       , Aggregations+       , AggregationResults+       , Bucket(..)+       , BucketAggregation(..)+       , TermsAggregation(..)+       , ValueCountAggregation(..)+       , FilterAggregation(..)+       , DateHistogramAggregation(..)+       , DateRangeAggregation(..)+       , DateRangeAggRange(..)+       , DateMathExpr(..)+       , DateMathAnchor(..)+       , DateMathModifier(..)+       , DateMathUnit(..)++       , Highlights(..)+       , FieldHighlight(..)+       , HighlightSettings(..)+       , PlainHighlight(..)+       , PostingsHighlight(..)+       , FastVectorHighlight(..)+       , CommonHighlight(..)+       , NonPostings(..)+       , HighlightEncoder(..)+       , HighlightTag(..)+       , HitHighlight++       , TermsResult(..)+       , DateHistogramResult(..)+       , DateRangeResult(..)+         ) where++import           Control.Applicative+import           Control.Monad.Catch+import           Control.Monad.Except+import           Control.Monad.Reader+import           Control.Monad.State+import           Control.Monad.Writer+import           Data.Aeson+import           Data.Aeson.Types                (Pair, Parser, emptyObject,+                                                  parseMaybe)+import qualified Data.ByteString.Lazy.Char8      as L+import           Data.Char+import           Data.Hashable                   (Hashable)+import qualified Data.HashMap.Strict             as HM+import           Data.List                       (foldl', nub)+import           Data.List.NonEmpty              (NonEmpty (..), toList)+import qualified Data.Map.Strict                 as M+import           Data.Maybe+import           Data.Text                       (Text)+import qualified Data.Text                       as T+import           Data.Time.Calendar+import           Data.Time.Clock                 (NominalDiffTime, UTCTime)+import           Data.Time.Clock.POSIX+import qualified Data.Traversable                as DT+import           Data.Typeable                   (Typeable)+import qualified Data.Vector                     as V+import           GHC.Enum+import           GHC.Generics                    (Generic)+import           Network.HTTP.Client+import qualified Network.HTTP.Types.Method       as NHTM++import           Database.Bloodhound.Types.Class++-- $setup+-- >>> :set -XOverloadedStrings+-- >>> import Database.Bloodhound+-- >>> let testServer = (Server "http://localhost:9200")+-- >>> let testIndex = IndexName "twitter"+-- >>> let testMapping = MappingName "tweet"+-- >>> let defaultIndexSettings = IndexSettings (ShardCount 3) (ReplicaCount 2)++-- defaultIndexSettings is exported by Database.Bloodhound as well+-- no trailing slashes in servers, library handles building the path.++{-| Common environment for Elasticsearch calls. Connections will be+    pipelined according to the provided HTTP connection manager.+-}+data BHEnv = BHEnv { bhServer  :: Server+                   , bhManager :: Manager+                   }++{-| All API calls to Elasticsearch operate within+    MonadBH. The idea is that it can be easily embedded in your+    own monad transformer stack. A default instance for a ReaderT and+    alias 'BH' is provided for the simple case.+-}+class (Functor m, Applicative m, MonadIO m) => MonadBH m where+  getBHEnv :: m BHEnv++newtype BH m a = BH {+      unBH :: ReaderT BHEnv m a+    } deriving ( Functor+               , Applicative+               , Monad+               , MonadIO+               , MonadState s+               , MonadWriter w+               , MonadError e+               , Alternative+               , MonadPlus+               , MonadFix+               , MonadThrow+               , MonadCatch+               , MonadMask)++instance MonadTrans BH where+  lift = BH . lift++instance (MonadReader r m) => MonadReader r (BH m) where+    ask = lift ask+    local f (BH (ReaderT m)) = BH $ ReaderT $ \r ->+      local f (m r)++instance (Functor m, Applicative m, MonadIO m) => MonadBH (BH m) where+  getBHEnv = BH getBHEnv+++instance (Functor m, Applicative m, MonadIO m) => MonadBH (ReaderT BHEnv m) where+  getBHEnv = ask++runBH :: BHEnv -> BH m a -> m a+runBH e f = runReaderT (unBH f) e++{-| 'Version' is embedded in 'Status' -}+data Version = Version { number          :: Text+                       , build_hash      :: Text+                       , build_timestamp :: UTCTime+                       , build_snapshot  :: Bool+                       , lucene_version  :: Text } deriving (Eq, Show, Generic, Typeable)++{-| 'Status' is a data type for describing the JSON body returned by+    Elasticsearch when you query its status. This was deprecated in 1.2.0.++   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-status.html#indices-status>+-}++data Status = Status { ok      :: Maybe Bool+                     , status  :: Int+                     , name    :: Text+                     , version :: Version+                     , tagline :: Text } deriving (Eq, Show, Generic)++{-| 'IndexSettings' is used to configure the shards and replicas when you create+   an Elasticsearch Index.++   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-create-index.html>+-}++data IndexSettings =+  IndexSettings { indexShards   :: ShardCount+                , indexReplicas :: ReplicaCount } deriving (Eq, Show, Generic, Typeable)++{-| 'defaultIndexSettings' is an 'IndexSettings' with 3 shards and 2 replicas. -}+defaultIndexSettings :: IndexSettings+defaultIndexSettings =  IndexSettings (ShardCount 3) (ReplicaCount 2)++{-| 'UpdatableIndexSetting' are settings which may be updated after an index is created.++   <https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-update-settings.html>+-}+data UpdatableIndexSetting = NumberOfReplicas ReplicaCount+                           -- ^ The number of replicas each shard has.+                           | AutoExpandReplicas ReplicaBounds+                           | BlocksReadOnly Bool+                           -- ^ Set to True to have the index read only. False to allow writes and metadata changes.+                           | BlocksRead Bool+                           -- ^ Set to True to disable read operations against the index.+                           | BlocksWrite Bool+                           -- ^ Set to True to disable write operations against the index.+                           | BlocksMetaData Bool+                           -- ^ Set to True to disable metadata operations against the index.+                           | RefreshInterval NominalDiffTime+                           -- ^ The async refresh interval of a shard+                           | IndexConcurrency Int+                           | FailOnMergeFailure Bool+                           | TranslogFlushThresholdOps Int+                           -- ^ When to flush on operations.+                           | TranslogFlushThresholdSize Bytes+                           -- ^ When to flush based on translog (bytes) size.+                           | TranslogFlushThresholdPeriod NominalDiffTime+                           -- ^ When to flush based on a period of not flushing.+                           | TranslogDisableFlush Bool+                           -- ^ Disables flushing. Note, should be set for a short interval and then enabled.+                           | CacheFilterMaxSize (Maybe Bytes)+                           -- ^ The maximum size of filter cache (per segment in shard).+                           | CacheFilterExpire (Maybe NominalDiffTime)+                           -- ^ The expire after access time for filter cache.+                           | GatewaySnapshotInterval NominalDiffTime+                           -- ^ The gateway snapshot interval (only applies to shared gateways).+                           | RoutingAllocationInclude (NonEmpty NodeAttrFilter)+                           -- ^ A node matching any rule will be allowed to host shards from the index.+                           | RoutingAllocationExclude (NonEmpty NodeAttrFilter)+                           -- ^ A node matching any rule will NOT be allowed to host shards from the index.+                           | RoutingAllocationRequire (NonEmpty NodeAttrFilter)+                           -- ^ Only nodes matching all rules will be allowed to host shards from the index.+                           | RoutingAllocationEnable AllocationPolicy+                           -- ^ Enables shard allocation for a specific index.+                           | RoutingAllocationShardsPerNode ShardCount+                           -- ^ Controls the total number of shards (replicas and primaries) allowed to be allocated on a single node.+                           | RecoveryInitialShards InitialShardCount+                           -- ^ When using local gateway a particular shard is recovered only if there can be allocated quorum shards in the cluster.+                           | GCDeletes NominalDiffTime+                           | TTLDisablePurge Bool+                           -- ^ Disables temporarily the purge of expired docs.+                           | TranslogFSType FSType+                           | IndexCompoundFormat CompoundFormat+                           | IndexCompoundOnFlush Bool+                           | WarmerEnabled Bool+                           deriving (Eq, Show, Generic, Typeable)++data AllocationPolicy = AllocAll+                      -- ^ Allows shard allocation for all shards.+                      | AllocPrimaries+                      -- ^ Allows shard allocation only for primary shards.+                      | AllocNewPrimaries+                      -- ^ Allows shard allocation only for primary shards for new indices.+                      | AllocNone+                      -- ^ No shard allocation is allowed+                      deriving (Eq, Show, Generic, Typeable)++data ReplicaBounds = ReplicasBounded Int Int+                   | ReplicasLowerBounded Int+                   | ReplicasUnbounded+                   deriving (Eq, Show, Generic, Typeable)++newtype Bytes = Bytes Int deriving (Eq, Show, Generic, Typeable, Ord, ToJSON, FromJSON)++data FSType = FSSimple+            | FSBuffered deriving (Eq, Show, Generic, Typeable, Ord)++data InitialShardCount = QuorumShards+                       | QuorumMinus1Shards+                       | FullShards+                       | FullMinus1Shards+                       | ExplicitShards Int+                       deriving (Eq, Show, Generic, Typeable)++data NodeAttrFilter = NodeAttrFilter { nodeAttrFilterName   :: NodeAttrName+                                     , nodeAttrFilterValues :: NonEmpty Text}+                                     deriving (Eq, Show, Generic, Ord)++newtype NodeAttrName = NodeAttrName Text deriving (Eq, Show, Ord, Generic, Typeable)++data CompoundFormat = CompoundFileFormat Bool+                    | MergeSegmentVsTotalIndex Double+                    -- ^ percentage between 0 and 1 where 0 is false, 1 is true+                    deriving (Eq, Show, Generic, Typeable)++newtype NominalDiffTimeJSON = NominalDiffTimeJSON { ndtJSON ::  NominalDiffTime }++data IndexSettingsSummary = IndexSettingsSummary { sSummaryIndexName :: IndexName+                                                 , sSummaryFixedSettings :: IndexSettings+                                                 , sSummaryUpdateable :: [UpdatableIndexSetting]}+                                                 deriving (Eq, Show, Generic, Typeable)++{-| 'Reply' and 'Method' are type synonyms from 'Network.HTTP.Types.Method.Method' -}+type Reply = Network.HTTP.Client.Response L.ByteString+type Method = NHTM.Method++{-| 'OpenCloseIndex' is a sum type for opening and closing indices.++   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/indices-open-close.html>+-}+data OpenCloseIndex = OpenIndex | CloseIndex deriving (Eq, Show, Generic, Typeable)++data FieldType = GeoPointType+               | GeoShapeType+               | FloatType+               | IntegerType+               | LongType+               | ShortType+               | ByteType deriving (Eq, Show, Generic, Typeable)++data FieldDefinition =+  FieldDefinition { fieldType :: FieldType } deriving (Eq, Show, Generic, Typeable)++{-| An 'IndexTemplate' defines a template that will automatically be+    applied to new indices created. The templates include both+    'IndexSettings' and mappings, and a simple 'TemplatePattern' that+    controls if the template will be applied to the index created.+    Specify mappings as follows: @[toJSON TweetMapping, ...]@++    https://www.elastic.co/guide/en/elasticsearch/reference/1.7/indices-templates.html+-}+data IndexTemplate =+  IndexTemplate { templatePattern  :: TemplatePattern+                , templateSettings :: Maybe IndexSettings+                , templateMappings :: [Value]+                }++data MappingField =+  MappingField   { mappingFieldName :: FieldName+                 , fieldDefinition  :: FieldDefinition } deriving (Eq, Show, Generic, Typeable)++{-| Support for type reification of 'Mapping's is currently incomplete, for+    now the mapping API verbiage expects a 'ToJSON'able blob.++    Indexes have mappings, mappings are schemas for the documents contained in the+    index. I'd recommend having only one mapping per index, always having a mapping,+    and keeping different kinds of documents separated if possible.+-}+data Mapping = Mapping { typeName      :: TypeName+                       , mappingFields :: [MappingField] } deriving (Eq, Show, Generic, Typeable)++{-| 'BulkOperation' is a sum type for expressing the four kinds of bulk+    operation index, create, delete, and update. 'BulkIndex' behaves like an+    "upsert", 'BulkCreate' will fail if a document already exists at the DocId.++   <http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/docs-bulk.html#docs-bulk>+-}+data BulkOperation =+    BulkIndex  IndexName MappingName DocId Value+  | BulkCreate IndexName MappingName DocId Value+  | BulkDelete IndexName MappingName DocId+  | BulkUpdate IndexName MappingName DocId Value deriving (Eq, Show, Generic, Typeable)++{-| 'EsResult' describes the standard wrapper JSON document that you see in+    successful Elasticsearch lookups or lookups that couldn't find the document.+-}+data EsResult a = EsResult { _index      :: Text+                           , _type       :: Text+                           , _id         :: Text+                           , foundResult :: Maybe (EsResultFound a)} deriving (Eq, Show, Generic, Typeable)++{-| 'EsResultFound' contains the document and its metadata inside of an+    'EsResult' when the document was successfully found.+-}+data EsResultFound a = EsResultFound {  _version :: DocVersion+                                     , _source   :: a } deriving (Eq, Show, Generic, Typeable)++{-| 'EsError' is the generic type that will be returned when there was a+    problem. If you can't parse the expected response, its a good idea to+    try parsing this.+-}+data EsError = EsError { errorStatus  :: Int+                       , errorMessage :: Text } deriving (Eq, Show, Generic, Typeable)++{-| 'EsProtocolException' ideally should never be thrown. It will only+be thrown when Bloodhound can't parse a response returned by the+ElasticSearch server. This should be reported as a bug to the bug+tracker. Be sure to include the body.+-}+data EsProtocolException = EsProtocolException { esProtoExBody :: L.ByteString }+                                               deriving (Eq, Show, Generic, Typeable)++instance Exception EsProtocolException++data IndexAlias = IndexAlias { srcIndex   :: IndexName+                             , indexAlias :: IndexAliasName } deriving (Eq, Show, Generic, Typeable)++newtype IndexAliasName = IndexAliasName { indexAliasName :: IndexName } deriving (Eq, Show, Generic, ToJSON)++data IndexAliasAction = AddAlias IndexAlias IndexAliasCreate+                      | RemoveAlias IndexAlias deriving (Show, Eq, Generic, Typeable)++data IndexAliasCreate = IndexAliasCreate { aliasCreateRouting :: Maybe AliasRouting+                                         , aliasCreateFilter  :: Maybe Filter}+                                         deriving (Show, Eq, Generic, Typeable)++data AliasRouting = AllAliasRouting RoutingValue+                  | GranularAliasRouting (Maybe SearchAliasRouting) (Maybe IndexAliasRouting)+                  deriving (Show, Eq, Generic, Typeable)++newtype SearchAliasRouting = SearchAliasRouting (NonEmpty RoutingValue) deriving (Show, Eq, Generic, Typeable)++newtype IndexAliasRouting = IndexAliasRouting RoutingValue deriving (Show, Eq, Generic, ToJSON, FromJSON, Typeable)++newtype RoutingValue = RoutingValue { routingValue :: Text } deriving (Show, Eq, Generic, ToJSON, FromJSON, Typeable)++newtype IndexAliasesSummary = IndexAliasesSummary { indexAliasesSummary :: [IndexAliasSummary] } deriving (Show, Eq, Generic, Typeable)++{-| 'IndexAliasSummary' is a summary of an index alias configured for a server. -}+data IndexAliasSummary = IndexAliasSummary { indexAliasSummaryAlias  :: IndexAlias+                                           , indexAliasSummaryCreate :: IndexAliasCreate} deriving (Show, Eq, Generic, Typeable)++{-| 'DocVersion' is an integer version number for a document between 1+and 9.2e+18 used for <<https://www.elastic.co/guide/en/elasticsearch/guide/current/optimistic-concurrency-control.html optimistic concurrency control>>.+-}+newtype DocVersion = DocVersion {+      docVersionNumber :: Int+    } deriving (Eq, Show, Generic, Ord, ToJSON)++-- | Smart constructor for in-range doc version+mkDocVersion :: Int -> Maybe DocVersion+mkDocVersion i+  | i >= (docVersionNumber minBound) && i <= (docVersionNumber maxBound) =+    Just $ DocVersion i+  | otherwise = Nothing+++{-| 'ExternalDocVersion' is a convenience wrapper if your code uses its+own version numbers instead of ones from ES.+-}+newtype ExternalDocVersion = ExternalDocVersion DocVersion+    deriving (Eq, Show, Generic, Ord, Bounded, Enum, ToJSON)++{-| 'VersionControl' is specified when indexing documents as a+optimistic concurrency control.+-}+data VersionControl = NoVersionControl+                    -- ^ Don't send a version. This is a pure overwrite.+                    | InternalVersion DocVersion+                    -- ^ Use the default ES versioning scheme. Only+                    -- index the document if the version is the same+                    -- as the one specified. Only applicable to+                    -- updates, as you should be getting Version from+                    -- a search result.+                    | ExternalGT ExternalDocVersion+                    -- ^ Use your own version numbering. Only index+                    -- the document if the version is strictly higher+                    -- OR the document doesn't exist. The given+                    -- version will be used as the new version number+                    -- for the stored document. N.B. All updates must+                    -- increment this number, meaning there is some+                    -- global, external ordering of updates.+                    | ExternalGTE ExternalDocVersion+                    -- ^ Use your own version numbering. Only index+                    -- the document if the version is equal or higher+                    -- than the stored version. Will succeed if there+                    -- is no existing document. The given version will+                    -- be used as the new version number for the+                    -- stored document. Use with care, as this could+                    -- result in data loss.+                    | ForceVersion ExternalDocVersion+                    -- ^ The document will always be indexed and the+                    -- given version will be the new version. This is+                    -- typically used for correcting errors. Use with+                    -- care, as this could result in data loss.+                    deriving (Show, Eq, Generic, Ord)++{-| 'DocumentParent' is used to specify a parent document.+-}+newtype DocumentParent = DocumentParent DocId+  deriving (Eq, Show, Generic, Typeable)++{-| 'IndexDocumentSettings' are special settings supplied when indexing+a document. For the best backwards compatiblity when new fields are+added, you should probably prefer to start with 'defaultIndexDocumentSettings'+-}+data IndexDocumentSettings =+  IndexDocumentSettings { idsVersionControl :: VersionControl+                        , idsParent         :: Maybe DocumentParent+                        } deriving (Eq, Show, Generic, Typeable)++{-| Reasonable default settings. Chooses no version control and no parent.+-}+defaultIndexDocumentSettings :: IndexDocumentSettings+defaultIndexDocumentSettings = IndexDocumentSettings NoVersionControl Nothing++{-| 'Sort' is a synonym for a list of 'SortSpec's. Sort behavior is order+    dependent with later sorts acting as tie-breakers for earlier sorts.+-}+type Sort = [SortSpec]++{-| The two main kinds of 'SortSpec' are 'DefaultSortSpec' and+    'GeoDistanceSortSpec'. The latter takes a 'SortOrder', 'GeoPoint', and+    'DistanceUnit' to express "nearness" to a single geographical point as a+    sort specification.++<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>+-}+data SortSpec = DefaultSortSpec DefaultSort+              | GeoDistanceSortSpec SortOrder GeoPoint DistanceUnit deriving (Eq, Show, Generic, Typeable)++{-| 'DefaultSort' is usually the kind of 'SortSpec' you'll want. There's a+    'mkSort' convenience function for when you want to specify only the most+    common parameters.++<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>+-}+data DefaultSort =+  DefaultSort { sortFieldName  :: FieldName+              , sortOrder      :: SortOrder+                                  -- default False+              , ignoreUnmapped :: Bool+              , sortMode       :: Maybe SortMode+              , missingSort    :: Maybe Missing+              , nestedFilter   :: Maybe Filter } deriving (Eq, Show, Generic, Typeable)++{-| 'SortOrder' is 'Ascending' or 'Descending', as you might expect. These get+    encoded into "asc" or "desc" when turned into JSON.++<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#search-request-sort>+-}+data SortOrder = Ascending+               | Descending deriving (Eq, Show, Generic, Typeable)++{-| 'Missing' prescribes how to handle missing fields. A missing field can be+    sorted last, first, or using a custom value as a substitute.++<http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_missing_values>+-}+data Missing = LastMissing+             | FirstMissing+             | CustomMissing Text deriving (Eq, Show, Generic, Typeable)++{-| 'SortMode' prescribes how to handle sorting array/multi-valued fields.++http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-sort.html#_sort_mode_option+-}+data SortMode = SortMin+              | SortMax+              | SortSum+              | SortAvg deriving (Eq, Show, Generic, Typeable)++{-| 'mkSort' defaults everything but the 'FieldName' and the 'SortOrder' so+    that you can concisely describe the usual kind of 'SortSpec's you want.+-}+mkSort :: FieldName -> SortOrder -> DefaultSort+mkSort fieldName sOrder = DefaultSort fieldName sOrder False Nothing Nothing Nothing++{-| 'Cache' is for telling ES whether it should cache a 'Filter' not.+    'Query's cannot be cached.+-}+type Cache   = Bool -- caching on/off+defaultCache :: Cache+defaultCache = False++{-| 'PrefixValue' is used in 'PrefixQuery' as the main query component.+-}+type PrefixValue = Text++{-| 'BooleanOperator' is the usual And/Or operators with an ES compatible+    JSON encoding baked in. Used all over the place.+-}+data BooleanOperator = And | Or deriving (Eq, Show, Generic, Typeable)++{-| 'ShardCount' is part of 'IndexSettings'+-}+newtype ShardCount = ShardCount Int deriving (Eq, Show, Generic, ToJSON, Typeable)++{-| 'ReplicaCount' is part of 'IndexSettings'+-}+newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic, ToJSON, Typeable)++{-| 'Server' is used with the client functions to point at the ES instance+-}+newtype Server = Server Text deriving (Eq, Show, Generic, Typeable)++{-| 'IndexName' is used to describe which index to query/create/delete+-}+newtype IndexName = IndexName Text deriving (Eq, Generic, Show, ToJSON, FromJSON, Typeable)++{-| 'TemplateName' is used to describe which template to query/create/delete+-}+newtype TemplateName = TemplateName Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'TemplatePattern' represents a pattern which is matched against index names+-}+newtype TemplatePattern = TemplatePattern Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'MappingName' is part of mappings which are how ES describes and schematizes+    the data in the indices.+-}+newtype MappingName = MappingName Text deriving (Eq, Generic, Show, ToJSON, FromJSON, Typeable)++{-| '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, Generic, Show, ToJSON, FromJSON, Typeable)++{-| 'QueryString' is used to wrap query text bodies, be they human written or not.+-}+newtype QueryString = QueryString Text deriving (Eq, Generic, Show, ToJSON, FromJSON, Typeable)++{-| '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, Show, Generic, ToJSON, FromJSON, Typeable)+++{-| '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, Generic, Typeable)++{-| 'CacheName' is used in 'RegexpFilter' for describing the+    'CacheKey' keyed caching behavior.+-}+newtype CacheName = CacheName Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'CacheKey' is used in 'RegexpFilter' to key regex caching.+-}+newtype CacheKey =+  CacheKey Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype Existence =+  Existence Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype NullValue =+  NullValue Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype CutoffFrequency =+  CutoffFrequency Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype Analyzer =+  Analyzer Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MaxExpansions =+  MaxExpansions Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| '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, Generic, ToJSON, FromJSON, Typeable)+newtype Tiebreaker =+  Tiebreaker Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype Boost =+  Boost Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype BoostTerms =+  BoostTerms Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| '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, Generic, ToJSON, FromJSON, Typeable)+newtype DisableCoord =+  DisableCoord Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype IgnoreTermFrequency =+  IgnoreTermFrequency Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MinimumTermFrequency =+  MinimumTermFrequency Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MaxQueryTerms =+  MaxQueryTerms Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype Fuzziness =+  Fuzziness Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'PrefixLength' is the prefix length used in queries, defaults to 0. -}+newtype PrefixLength =+  PrefixLength Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype TypeName =+  TypeName Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype PercentMatch =+  PercentMatch Double deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype StopWord =+  StopWord Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype QueryPath =+  QueryPath Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 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, Generic, ToJSON, FromJSON, Typeable)+newtype LowercaseExpanded =+  LowercaseExpanded        Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype EnablePositionIncrements =+  EnablePositionIncrements Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 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, Generic, ToJSON, FromJSON, Typeable)++{-| 'GeneratePhraseQueries' defaults to false.+-}+newtype GeneratePhraseQueries =+  GeneratePhraseQueries Bool deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'Locale' is used for string conversions - defaults to ROOT.+-}+newtype Locale        = Locale        Text deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MaxWordLength = MaxWordLength Int  deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MinWordLength = MinWordLength Int  deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++{-| 'PhraseSlop' sets the default slop for phrases, 0 means exact+     phrase matches. Default is 0.+-}+newtype PhraseSlop      = PhraseSlop      Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)+newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic, ToJSON, FromJSON, Typeable)++-- | 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 }++{-| 'unpackId' is a silly convenience function that gets used once.+-}+unpackId :: DocId -> Text+unpackId (DocId docId) = docId++type TrackSortScores = Bool+newtype From = From Int deriving (Eq, Show, Generic, ToJSON)+newtype Size = Size Int deriving (Eq, Show, Generic, ToJSON)++data Search = Search { queryBody       :: Maybe Query+                     , filterBody      :: Maybe Filter+                     , sortBody        :: Maybe Sort+                     , aggBody         :: Maybe Aggregations+                     , highlight       :: Maybe Highlights+                       -- default False+                     , trackSortScores :: TrackSortScores+                     , from            :: From+                     , size            :: Size+                     , searchType      :: SearchType+                     , fields          :: Maybe [FieldName]+                     , source          :: Maybe Source } deriving (Eq, Show, Generic, Typeable)++data SearchType = SearchTypeQueryThenFetch+                | SearchTypeDfsQueryThenFetch+                | SearchTypeCount+                | SearchTypeScan+                | SearchTypeQueryAndFetch+                | SearchTypeDfsQueryAndFetch+  deriving (Eq, Show, Generic, Typeable)++data Source =+    NoSource+  | SourcePatterns PatternOrPatterns+  | SourceIncludeExclude Include Exclude+    deriving (Show, Eq, Generic, Typeable)++data PatternOrPatterns = PopPattern   Pattern+                       | PopPatterns [Pattern] deriving (Eq, Show, Generic, Typeable)++data Include = Include [Pattern] deriving (Eq, Show, Generic, Typeable)+data Exclude = Exclude [Pattern] deriving (Eq, Show, Generic, Typeable)++newtype Pattern = Pattern Text deriving (Eq, Show, Generic, Typeable)++data Highlights = Highlights { globalsettings  :: Maybe HighlightSettings+                             , highlightFields :: [FieldHighlight]+                             } deriving (Show, Eq, Generic, Typeable)++data FieldHighlight = FieldHighlight FieldName (Maybe HighlightSettings)+                      deriving (Show, Eq, Generic, Typeable)+++data HighlightSettings = Plain PlainHighlight+                       | Postings PostingsHighlight+                       | FastVector FastVectorHighlight+                         deriving (Show, Eq, Generic, Typeable)+data PlainHighlight =+    PlainHighlight { plainCommon  :: Maybe CommonHighlight+                   , plainNonPost :: Maybe NonPostings } deriving (Show, Eq, Generic, Typeable)++ -- This requires that index_options are set to 'offset' in the mapping.+data PostingsHighlight = PostingsHighlight (Maybe CommonHighlight) deriving (Show, Eq, Generic, Typeable)++-- This requires that term_vector is set to 'with_positions_offsets' in the mapping.+data FastVectorHighlight =+    FastVectorHighlight { fvCommon          :: Maybe CommonHighlight+                        , fvNonPostSettings :: Maybe NonPostings+                        , boundaryChars     :: Maybe Text+                        , boundaryMaxScan   :: Maybe Int+                        , fragmentOffset    :: Maybe Int+                        , matchedFields     :: [Text]+                        , phraseLimit       :: Maybe Int+                        } deriving (Show, Eq, Generic, Typeable)++data CommonHighlight =+    CommonHighlight { order             :: Maybe Text+                    , forceSource       :: Maybe Bool+                    , tag               :: Maybe HighlightTag+                    , encoder           :: Maybe HighlightEncoder+                    , noMatchSize       :: Maybe Int+                    , highlightQuery    :: Maybe Query+                    , requireFieldMatch :: Maybe Bool+                    } deriving (Show, Eq, Generic, Typeable)++-- Settings that are only applicable to FastVector and Plain highlighters.+data NonPostings =+    NonPostings { fragmentSize      :: Maybe Int+                , numberOfFragments :: Maybe Int} deriving (Show, Eq, Generic, Typeable)++data HighlightEncoder = DefaultEncoder+                      | HTMLEncoder+                      deriving (Show, Eq, Generic, Typeable)++-- NOTE: Should the tags use some kind of HTML type, rather than Text?+data HighlightTag = TagSchema Text+                  | CustomTags ([Text], [Text]) -- Only uses more than the first value in the lists if fvh+                  deriving (Show, Eq, Generic, Typeable)+++data Query =+  TermQuery                     Term (Maybe Boost)+  | TermsQuery                  Text (NonEmpty Text)+  | QueryMatchQuery             MatchQuery+  | QueryMultiMatchQuery        MultiMatchQuery+  | QueryBoolQuery              BoolQuery+  | QueryBoostingQuery          BoostingQuery+  | QueryCommonTermsQuery       CommonTermsQuery+  | ConstantScoreFilter         Filter Boost+  | ConstantScoreQuery          Query Boost+  | QueryDisMaxQuery            DisMaxQuery+  | QueryFilteredQuery          FilteredQuery+  | QueryFuzzyLikeThisQuery     FuzzyLikeThisQuery+  | QueryFuzzyLikeFieldQuery    FuzzyLikeFieldQuery+  | QueryFuzzyQuery             FuzzyQuery+  | QueryHasChildQuery          HasChildQuery+  | QueryHasParentQuery         HasParentQuery+  | IdsQuery                    MappingName [DocId]+  | QueryIndicesQuery           IndicesQuery+  | MatchAllQuery               (Maybe Boost)+  | QueryMoreLikeThisQuery      MoreLikeThisQuery+  | QueryMoreLikeThisFieldQuery MoreLikeThisFieldQuery+  | QueryNestedQuery            NestedQuery+  | QueryPrefixQuery            PrefixQuery+  | QueryQueryStringQuery       QueryStringQuery+  | QuerySimpleQueryStringQuery SimpleQueryStringQuery+  | QueryRangeQuery             RangeQuery+  | QueryRegexpQuery            RegexpQuery+  deriving (Eq, Show, Generic, Typeable)++data RegexpQuery =+  RegexpQuery { regexpQueryField :: FieldName+              , regexpQuery      :: Regexp+              , regexpQueryFlags :: RegexpFlags+              , regexpQueryBoost :: Maybe Boost+              } deriving (Eq, Show, Generic, Typeable)++data RangeQuery =+  RangeQuery { rangeQueryField :: FieldName+             , rangeQueryRange :: RangeValue+             , rangeQueryBoost :: Boost } deriving (Eq, Show, Generic, Typeable)++mkRangeQuery :: FieldName -> RangeValue -> RangeQuery+mkRangeQuery f r = RangeQuery f r (Boost 1.0)++data SimpleQueryStringQuery =+  SimpleQueryStringQuery+    { simpleQueryStringQuery             :: QueryString+    , simpleQueryStringField             :: Maybe FieldOrFields+    , simpleQueryStringOperator          :: Maybe BooleanOperator+    , simpleQueryStringAnalyzer          :: Maybe Analyzer+    , simpleQueryStringFlags             :: Maybe (NonEmpty SimpleQueryFlag)+    , simpleQueryStringLowercaseExpanded :: Maybe LowercaseExpanded+    , simpleQueryStringLocale            :: Maybe Locale+    } deriving (Eq, Show, Generic, Typeable)++data SimpleQueryFlag =+  SimpleQueryAll+  | SimpleQueryNone+  | SimpleQueryAnd+  | SimpleQueryOr+  | SimpleQueryPrefix+  | SimpleQueryPhrase+  | SimpleQueryPrecedence+  | SimpleQueryEscape+  | SimpleQueryWhitespace+  | SimpleQueryFuzzy+  | SimpleQueryNear+  | SimpleQuerySlop deriving (Eq, Show, Generic, Typeable)++-- use_dis_max and tie_breaker when fields are plural?+data QueryStringQuery =+  QueryStringQuery+  { queryStringQuery                    :: QueryString+  , queryStringDefaultField             :: Maybe FieldName+  , queryStringOperator                 :: Maybe BooleanOperator+  , queryStringAnalyzer                 :: Maybe Analyzer+  , queryStringAllowLeadingWildcard     :: Maybe AllowLeadingWildcard+  , queryStringLowercaseExpanded        :: Maybe LowercaseExpanded+  , queryStringEnablePositionIncrements :: Maybe EnablePositionIncrements+  , queryStringFuzzyMaxExpansions       :: Maybe MaxExpansions+  , queryStringFuzziness                :: Maybe Fuzziness+  , queryStringFuzzyPrefixLength        :: Maybe PrefixLength+  , queryStringPhraseSlop               :: Maybe PhraseSlop+  , queryStringBoost                    :: Maybe Boost+  , queryStringAnalyzeWildcard          :: Maybe AnalyzeWildcard+  , queryStringGeneratePhraseQueries    :: Maybe GeneratePhraseQueries+  , queryStringMinimumShouldMatch       :: Maybe MinimumMatch+  , queryStringLenient                  :: Maybe Lenient+  , queryStringLocale                   :: Maybe Locale+  } deriving (Eq, Show, Generic, Typeable)++mkQueryStringQuery :: QueryString -> QueryStringQuery+mkQueryStringQuery qs =+  QueryStringQuery qs Nothing Nothing+  Nothing Nothing Nothing Nothing+  Nothing Nothing Nothing Nothing+  Nothing Nothing Nothing Nothing+  Nothing Nothing++data FieldOrFields = FofField   FieldName+                   | FofFields (NonEmpty FieldName) deriving (Eq, Show, Generic, Typeable)++data PrefixQuery =+  PrefixQuery+  { prefixQueryField       :: FieldName+  , prefixQueryPrefixValue :: Text+  , prefixQueryBoost       :: Maybe Boost } deriving (Eq, Show, Generic, Typeable)++data NestedQuery =+  NestedQuery+  { nestedQueryPath      :: QueryPath+  , nestedQueryScoreType :: ScoreType+  , nestedQuery          :: Query } deriving (Eq, Show, Generic, Typeable)++data MoreLikeThisFieldQuery =+  MoreLikeThisFieldQuery+  { moreLikeThisFieldText            :: Text+  , moreLikeThisFieldFields          :: FieldName+                                        -- default 0.3 (30%)+  , moreLikeThisFieldPercentMatch    :: Maybe PercentMatch+  , moreLikeThisFieldMinimumTermFreq :: Maybe MinimumTermFrequency+  , moreLikeThisFieldMaxQueryTerms   :: Maybe MaxQueryTerms+  , moreLikeThisFieldStopWords       :: Maybe (NonEmpty StopWord)+  , moreLikeThisFieldMinDocFrequency :: Maybe MinDocFrequency+  , moreLikeThisFieldMaxDocFrequency :: Maybe MaxDocFrequency+  , moreLikeThisFieldMinWordLength   :: Maybe MinWordLength+  , moreLikeThisFieldMaxWordLength   :: Maybe MaxWordLength+  , moreLikeThisFieldBoostTerms      :: Maybe BoostTerms+  , moreLikeThisFieldBoost           :: Maybe Boost+  , moreLikeThisFieldAnalyzer        :: Maybe Analyzer+  } deriving (Eq, Show, Generic, Typeable)++data MoreLikeThisQuery =+  MoreLikeThisQuery+  { moreLikeThisText            :: Text+  , moreLikeThisFields          :: Maybe (NonEmpty FieldName)+    -- default 0.3 (30%)+  , moreLikeThisPercentMatch    :: Maybe PercentMatch+  , moreLikeThisMinimumTermFreq :: Maybe MinimumTermFrequency+  , moreLikeThisMaxQueryTerms   :: Maybe MaxQueryTerms+  , moreLikeThisStopWords       :: Maybe (NonEmpty StopWord)+  , moreLikeThisMinDocFrequency :: Maybe MinDocFrequency+  , moreLikeThisMaxDocFrequency :: Maybe MaxDocFrequency+  , moreLikeThisMinWordLength   :: Maybe MinWordLength+  , moreLikeThisMaxWordLength   :: Maybe MaxWordLength+  , moreLikeThisBoostTerms      :: Maybe BoostTerms+  , moreLikeThisBoost           :: Maybe Boost+  , moreLikeThisAnalyzer        :: Maybe Analyzer+  } deriving (Eq, Show, Generic, Typeable)++data IndicesQuery =+  IndicesQuery+  { indicesQueryIndices :: [IndexName]+  , indicesQuery        :: Query+    -- default "all"+  , indicesQueryNoMatch :: Maybe Query } deriving (Eq, Show, Generic, Typeable)++data HasParentQuery =+  HasParentQuery+  { hasParentQueryType      :: TypeName+  , hasParentQuery          :: Query+  , hasParentQueryScoreType :: Maybe ScoreType } deriving (Eq, Show, Generic, Typeable)++data HasChildQuery =+  HasChildQuery+  { hasChildQueryType      :: TypeName+  , hasChildQuery          :: Query+  , hasChildQueryScoreType :: Maybe ScoreType } deriving (Eq, Show, Generic, Typeable)++data ScoreType =+  ScoreTypeMax+  | ScoreTypeSum+  | ScoreTypeAvg+  | ScoreTypeNone deriving (Eq, Show, Generic, Typeable)++data FuzzyQuery =+  FuzzyQuery { fuzzyQueryField         :: FieldName+             , fuzzyQueryValue         :: Text+             , fuzzyQueryPrefixLength  :: PrefixLength+             , fuzzyQueryMaxExpansions :: MaxExpansions+             , fuzzyQueryFuzziness     :: Fuzziness+             , fuzzyQueryBoost         :: Maybe Boost+             } deriving (Eq, Show, Generic, Typeable)++data FuzzyLikeFieldQuery =+  FuzzyLikeFieldQuery+  { fuzzyLikeField                    :: FieldName+    -- anaphora is good for the soul.+  , fuzzyLikeFieldText                :: Text+  , fuzzyLikeFieldMaxQueryTerms       :: MaxQueryTerms+  , fuzzyLikeFieldIgnoreTermFrequency :: IgnoreTermFrequency+  , fuzzyLikeFieldFuzziness           :: Fuzziness+  , fuzzyLikeFieldPrefixLength        :: PrefixLength+  , fuzzyLikeFieldBoost               :: Boost+  , fuzzyLikeFieldAnalyzer            :: Maybe Analyzer+  } deriving (Eq, Show, Generic, Typeable)++data FuzzyLikeThisQuery =+  FuzzyLikeThisQuery+  { fuzzyLikeFields              :: [FieldName]+  , fuzzyLikeText                :: Text+  , fuzzyLikeMaxQueryTerms       :: MaxQueryTerms+  , fuzzyLikeIgnoreTermFrequency :: IgnoreTermFrequency+  , fuzzyLikeFuzziness           :: Fuzziness+  , fuzzyLikePrefixLength        :: PrefixLength+  , fuzzyLikeBoost               :: Boost+  , fuzzyLikeAnalyzer            :: Maybe Analyzer+  } deriving (Eq, Show, Generic, Typeable)++data FilteredQuery =+  FilteredQuery+  { filteredQuery  :: Query+  , filteredFilter :: Filter } deriving (Eq, Show, Generic, Typeable)++data DisMaxQuery =+  DisMaxQuery { disMaxQueries    :: [Query]+                -- default 0.0+              , disMaxTiebreaker :: Tiebreaker+              , disMaxBoost      :: Maybe Boost+              } deriving (Eq, Show, Generic, Typeable)++data MatchQuery =+  MatchQuery { matchQueryField           :: FieldName+             , matchQueryQueryString     :: QueryString+             , matchQueryOperator        :: BooleanOperator+             , matchQueryZeroTerms       :: ZeroTermsQuery+             , matchQueryCutoffFrequency :: Maybe CutoffFrequency+             , matchQueryMatchType       :: Maybe MatchQueryType+             , matchQueryAnalyzer        :: Maybe Analyzer+             , matchQueryMaxExpansions   :: Maybe MaxExpansions+             , matchQueryLenient         :: Maybe Lenient+             , matchQueryBoost           :: Maybe Boost } deriving (Eq, Show, Generic, Typeable)++{-| 'mkMatchQuery' is a convenience function that defaults the less common parameters,+    enabling you to provide only the 'FieldName' and 'QueryString' to make a 'MatchQuery'+-}+mkMatchQuery :: FieldName -> QueryString -> MatchQuery+mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing++data MatchQueryType =+  MatchPhrase+  | MatchPhrasePrefix deriving (Eq, Show, Generic, Typeable)++data MultiMatchQuery =+  MultiMatchQuery { multiMatchQueryFields          :: [FieldName]+                  , multiMatchQueryString          :: QueryString+                  , multiMatchQueryOperator        :: BooleanOperator+                  , multiMatchQueryZeroTerms       :: ZeroTermsQuery+                  , multiMatchQueryTiebreaker      :: Maybe Tiebreaker+                  , multiMatchQueryType            :: Maybe MultiMatchQueryType+                  , multiMatchQueryCutoffFrequency :: Maybe CutoffFrequency+                  , multiMatchQueryAnalyzer        :: Maybe Analyzer+                  , multiMatchQueryMaxExpansions   :: Maybe MaxExpansions+                  , multiMatchQueryLenient         :: Maybe Lenient } deriving (Eq, Show, Generic, Typeable)++{-| 'mkMultiMatchQuery' is a convenience function that defaults the less common parameters,+    enabling you to provide only the list of 'FieldName's and 'QueryString' to+    make a 'MultiMatchQuery'.+-}++mkMultiMatchQuery :: [FieldName] -> QueryString -> MultiMatchQuery+mkMultiMatchQuery matchFields query =+  MultiMatchQuery matchFields query+  Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing++data MultiMatchQueryType =+  MultiMatchBestFields+  | MultiMatchMostFields+  | MultiMatchCrossFields+  | MultiMatchPhrase+  | MultiMatchPhrasePrefix deriving (Eq, Show, Generic, Typeable)++data BoolQuery =+  BoolQuery { boolQueryMustMatch          :: [Query]+            , boolQueryMustNotMatch       :: [Query]+            , boolQueryShouldMatch        :: [Query]+            , boolQueryMinimumShouldMatch :: Maybe MinimumMatch+            , boolQueryBoost              :: Maybe Boost+            , boolQueryDisableCoord       :: Maybe DisableCoord+            } deriving (Eq, Show, Generic, Typeable)++mkBoolQuery :: [Query] -> [Query] -> [Query] -> BoolQuery+mkBoolQuery must mustNot should =+  BoolQuery must mustNot should Nothing Nothing Nothing++data BoostingQuery =+  BoostingQuery { positiveQuery :: Query+                , negativeQuery :: Query+                , negativeBoost :: Boost } deriving (Eq, Show, Generic, Typeable)++data CommonTermsQuery =+  CommonTermsQuery { commonField              :: FieldName+                   , commonQuery              :: QueryString+                   , commonCutoffFrequency    :: CutoffFrequency+                   , commonLowFreqOperator    :: BooleanOperator+                   , commonHighFreqOperator   :: BooleanOperator+                   , commonMinimumShouldMatch :: Maybe CommonMinimumMatch+                   , commonBoost              :: Maybe Boost+                   , commonAnalyzer           :: Maybe Analyzer+                   , commonDisableCoord       :: Maybe DisableCoord+                   } deriving (Eq, Show, Generic, Typeable)++data CommonMinimumMatch =+    CommonMinimumMatchHighLow MinimumMatchHighLow+  | CommonMinimumMatch        MinimumMatch+  deriving (Eq, Show, Generic, Typeable)++data MinimumMatchHighLow =+  MinimumMatchHighLow { lowFreq  :: MinimumMatch+                      , highFreq :: MinimumMatch } deriving (Eq, Show, Generic, Typeable)++data Filter = AndFilter [Filter] Cache+            | OrFilter  [Filter] Cache+            | NotFilter  Filter  Cache+            | IdentityFilter+            | BoolFilter BoolMatch+            | ExistsFilter FieldName -- always cached+            | GeoBoundingBoxFilter GeoBoundingBoxConstraint+            | GeoDistanceFilter GeoPoint Distance DistanceType OptimizeBbox Cache+            | GeoDistanceRangeFilter GeoPoint DistanceRange+            | GeoPolygonFilter FieldName [LatLon]+            | IdsFilter MappingName [DocId]+            | LimitFilter Int+            | MissingFilter FieldName Existence NullValue+            | PrefixFilter  FieldName PrefixValue Cache+            | QueryFilter   Query Cache+            | RangeFilter   FieldName RangeValue RangeExecution Cache+            | RegexpFilter  FieldName Regexp RegexpFlags CacheName Cache CacheKey+            | TermFilter    Term Cache+              deriving (Eq, Show, Generic, Typeable)++data ZeroTermsQuery = ZeroTermsNone+                    | ZeroTermsAll deriving (Eq, Show, Generic, Typeable)++data RangeExecution = RangeExecutionIndex+                    | RangeExecutionFielddata deriving (Eq, Show, Generic, Typeable)++newtype Regexp = Regexp Text deriving (Eq, Show, Generic, Typeable, FromJSON)++data RegexpFlags = AllRegexpFlags+                 | NoRegexpFlags+                 | SomeRegexpFlags (NonEmpty RegexpFlag) deriving (Eq, Show, Generic, Typeable)++data RegexpFlag = AnyString+                | Automaton+                | Complement+                | Empty+                | Intersection+                | Interval deriving (Eq, Show, Generic, Typeable)++newtype LessThan = LessThan Double deriving (Eq, Show, Generic, Typeable)+newtype LessThanEq = LessThanEq Double deriving (Eq, Show, Generic, Typeable)+newtype GreaterThan = GreaterThan Double deriving (Eq, Show, Generic, Typeable)+newtype GreaterThanEq = GreaterThanEq Double deriving (Eq, Show, Generic, Typeable)++newtype LessThanD = LessThanD UTCTime deriving (Eq, Show, Generic, Typeable)+newtype LessThanEqD = LessThanEqD UTCTime deriving (Eq, Show, Generic, Typeable)+newtype GreaterThanD = GreaterThanD UTCTime deriving (Eq, Show, Generic, Typeable)+newtype GreaterThanEqD = GreaterThanEqD UTCTime deriving (Eq, Show, Generic, Typeable)++data RangeValue = RangeDateLte LessThanEqD+                | RangeDateLt LessThanD+                | RangeDateGte GreaterThanEqD+                | RangeDateGt GreaterThanD+                | RangeDateGtLt GreaterThanD LessThanD+                | RangeDateGteLte GreaterThanEqD LessThanEqD+                | RangeDateGteLt GreaterThanEqD LessThanD+                | RangeDateGtLte GreaterThanD LessThanEqD+                | RangeDoubleLte LessThanEq+                | RangeDoubleLt LessThan+                | RangeDoubleGte GreaterThanEq+                | RangeDoubleGt GreaterThan+                | RangeDoubleGtLt GreaterThan LessThan+                | RangeDoubleGteLte GreaterThanEq LessThanEq+                | RangeDoubleGteLt GreaterThanEq LessThan+                | RangeDoubleGtLte GreaterThan LessThanEq+                deriving (Eq, Show, Generic, Typeable)++rangeValueToPair :: RangeValue -> [Pair]+rangeValueToPair rv = case rv of+  RangeDateLte (LessThanEqD t)                       -> ["lte" .= t]+  RangeDateGte (GreaterThanEqD t)                    -> ["gte" .= t]+  RangeDateLt (LessThanD t)                          -> ["lt"  .= t]+  RangeDateGt (GreaterThanD t)                       -> ["gt"  .= t]+  RangeDateGteLte (GreaterThanEqD l) (LessThanEqD g) -> ["gte" .= l, "lte" .= g]+  RangeDateGtLte (GreaterThanD l) (LessThanEqD g)    -> ["gt"  .= l, "lte" .= g]+  RangeDateGteLt (GreaterThanEqD l) (LessThanD g)    -> ["gte" .= l, "lt"  .= g]+  RangeDateGtLt (GreaterThanD l) (LessThanD g)       -> ["gt"  .= l, "lt"  .= g]+  RangeDoubleLte (LessThanEq t)                      -> ["lte" .= t]+  RangeDoubleGte (GreaterThanEq t)                   -> ["gte" .= t]+  RangeDoubleLt (LessThan t)                         -> ["lt"  .= t]+  RangeDoubleGt (GreaterThan t)                      -> ["gt"  .= t]+  RangeDoubleGteLte (GreaterThanEq l) (LessThanEq g) -> ["gte" .= l, "lte" .= g]+  RangeDoubleGtLte (GreaterThan l) (LessThanEq g)    -> ["gt"  .= l, "lte" .= g]+  RangeDoubleGteLt (GreaterThanEq l) (LessThan g)    -> ["gte" .= l, "lt"  .= g]+  RangeDoubleGtLt (GreaterThan l) (LessThan g)       -> ["gt"  .= l, "lt"  .= g]++data Term = Term { termField :: Text+                 , termValue :: Text } deriving (Eq, Show, Generic, Typeable)++data BoolMatch = MustMatch    Term  Cache+               | MustNotMatch Term  Cache+               | ShouldMatch [Term] Cache deriving (Eq, Show, Generic, Typeable)++-- "memory" or "indexed"+data GeoFilterType = GeoFilterMemory+                   | GeoFilterIndexed deriving (Eq, Show, Generic, Typeable)++data LatLon = LatLon { lat :: Double+                     , lon :: Double } deriving (Eq, Show, Generic, Typeable)++data GeoBoundingBox =+  GeoBoundingBox { topLeft     :: LatLon+                 , bottomRight :: LatLon } deriving (Eq, Show, Generic, Typeable)++data GeoBoundingBoxConstraint =+  GeoBoundingBoxConstraint { geoBBField        :: FieldName+                           , constraintBox     :: GeoBoundingBox+                           , bbConstraintcache :: Cache+                           , geoType           :: GeoFilterType+                           } deriving (Eq, Show, Generic, Typeable)++data GeoPoint =+  GeoPoint { geoField :: FieldName+           , latLon   :: LatLon} deriving (Eq, Show, Generic, Typeable)++data DistanceUnit = Miles+                  | Yards+                  | Feet+                  | Inches+                  | Kilometers+                  | Meters+                  | Centimeters+                  | Millimeters+                  | NauticalMiles deriving (Eq, Show, Generic, Typeable)++data DistanceType = Arc+                  | SloppyArc -- doesn't exist <1.0+                  | Plane deriving (Eq, Show, Generic, Typeable)++data OptimizeBbox = OptimizeGeoFilterType GeoFilterType+                  | NoOptimizeBbox deriving (Eq, Show, Generic, Typeable)++data Distance =+  Distance { coefficient :: Double+           , unit        :: DistanceUnit } deriving (Eq, Show, Generic, Typeable)++data DistanceRange =+  DistanceRange { distanceFrom :: Distance+                , distanceTo   :: Distance } deriving (Eq, Show, Generic, Typeable)++data SearchResult a =+  SearchResult { took         :: Int+               , timedOut     :: Bool+               , shards       :: ShardResult+               , searchHits   :: SearchHits a+               , aggregations :: Maybe AggregationResults+               , scrollId     :: Maybe ScrollId } deriving (Eq, Show, Generic, Typeable)++newtype ScrollId = ScrollId Text deriving (Eq, Show, Generic, Ord, ToJSON, FromJSON)++type Score = Maybe Double++data SearchHits a =+  SearchHits { hitsTotal :: Int+             , maxScore  :: Score+             , hits      :: [Hit a] } deriving (Eq, Show, Generic, Typeable)+++instance Monoid (SearchHits a) where+  mempty = SearchHits 0 Nothing mempty+  mappend (SearchHits ta ma ha) (SearchHits tb mb hb) =+    SearchHits (ta + tb) (max ma mb) (ha <> hb)+++data Hit a =+  Hit { hitIndex     :: IndexName+      , hitType      :: MappingName+      , hitDocId     :: DocId+      , hitScore     :: Score+      , hitSource    :: Maybe a+      , hitHighlight :: Maybe HitHighlight } deriving (Eq, Show, Generic, Typeable)++data ShardResult =+  ShardResult { shardTotal       :: Int+              , shardsSuccessful :: Int+              , shardsFailed     :: Int } deriving (Eq, Show, Generic, Typeable)++type HitHighlight = M.Map Text [Text]++showText :: Show a => a -> Text+showText = T.pack . show++readMay :: Read a => String -> Maybe a+readMay s = case reads s of+              (a, ""):_ -> Just a+              _ -> Nothing++parseReadText :: Read a => Text -> Parser a+parseReadText = maybe mzero return . readMay . T.unpack++type Aggregations = M.Map Text Aggregation++emptyAggregations :: Aggregations+emptyAggregations = M.empty++mkAggregations :: Text -> Aggregation -> Aggregations+mkAggregations name aggregation = M.insert name aggregation emptyAggregations++data TermOrder = TermOrder{ termSortField :: Text+                          , termSortOrder :: SortOrder } deriving (Eq, Show, Generic, Typeable)++data TermInclusion = TermInclusion Text+                   | TermPattern Text Text deriving (Eq, Show, Generic, Typeable)++data CollectionMode = BreadthFirst+                    | DepthFirst deriving (Eq, Show, Generic, Typeable)++data ExecutionHint = Ordinals+                   | GlobalOrdinals+                   | GlobalOrdinalsHash+                   | GlobalOrdinalsLowCardinality+                   | Map deriving (Eq, Show, Generic, Typeable)++data TimeInterval = Weeks+                  | Days+                  | Hours+                  | Minutes+                  | Seconds deriving (Eq)++data Interval = Year+              | Quarter+              | Month+              | Week+              | Day+              | Hour+              | Minute+              | Second+              | FractionalInterval Float TimeInterval deriving (Eq, Show, Generic, Typeable)++data Aggregation = TermsAgg TermsAggregation+                 | DateHistogramAgg DateHistogramAggregation+                 | ValueCountAgg ValueCountAggregation+                 | FilterAgg FilterAggregation+                 | DateRangeAgg DateRangeAggregation deriving (Eq, Show, Generic, Typeable)+++data TermsAggregation = TermsAggregation { term              :: Either Text Text+                                         , termInclude       :: Maybe TermInclusion+                                         , termExclude       :: Maybe TermInclusion+                                         , termOrder         :: Maybe TermOrder+                                         , termMinDocCount   :: Maybe Int+                                         , termSize          :: Maybe Int+                                         , termShardSize     :: Maybe Int+                                         , termCollectMode   :: Maybe CollectionMode+                                         , termExecutionHint :: Maybe ExecutionHint+                                         , termAggs          :: Maybe Aggregations+                                    } deriving (Eq, Show, Generic, Typeable)++data DateHistogramAggregation = DateHistogramAggregation { dateField      :: FieldName+                                                         , dateInterval   :: Interval+                                                         , dateFormat     :: Maybe Text+                                                         -- pre and post deprecated in 1.5+                                                         , datePreZone    :: Maybe Text+                                                         , datePostZone   :: Maybe Text+                                                         , datePreOffset  :: Maybe Text+                                                         , datePostOffset :: Maybe Text+                                                         , dateAggs       :: Maybe Aggregations+                                                         } deriving (Eq, Show, Generic, Typeable)+++data DateRangeAggregation = DateRangeAggregation { draField  :: FieldName+                                                 , draFormat :: Maybe Text+                                                 , draRanges :: NonEmpty DateRangeAggRange+                                                 } deriving (Eq, Show, Generic, Typeable)++data DateRangeAggRange = DateRangeFrom DateMathExpr+                       | DateRangeTo DateMathExpr+                       | DateRangeFromAndTo DateMathExpr DateMathExpr deriving (Eq, Show, Generic, Typeable)++-- | See <https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#date-math> for more information.+data DateMathExpr = DateMathExpr DateMathAnchor [DateMathModifier] deriving (Eq, Show, Generic, Typeable)+++-- | Starting point for a date range. This along with the 'DateMathModifiers' gets you the date ES will start from.+data DateMathAnchor = DMNow+                    | DMDate Day deriving (Eq, Show, Generic, Typeable)++data DateMathModifier = AddTime Int DateMathUnit+                      | SubtractTime Int DateMathUnit+                      | RoundDownTo DateMathUnit deriving (Eq, Show, Generic, Typeable)++data DateMathUnit = DMYear+                  | DMMonth+                  | DMWeek+                  | DMDay+                  | DMHour+                  | DMMinute+                  | DMSecond deriving (Eq, Show, Generic, Typeable)++-- | See <https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-valuecount-aggregation.html> for more information.+data ValueCountAggregation = FieldValueCount FieldName+                           | ScriptValueCount Script deriving (Eq, Show, Generic, Typeable)++-- | Single-bucket filter aggregations. See <https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html#search-aggregations-bucket-filter-aggregation> for more information.+data FilterAggregation = FilterAggregation { faFilter :: Filter+                                           , faAggs   :: Maybe Aggregations} deriving (Eq, Show, Generic, Typeable)++mkTermsAggregation :: Text -> TermsAggregation+mkTermsAggregation t = TermsAggregation (Left t) Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing++mkTermsScriptAggregation :: Text -> TermsAggregation+mkTermsScriptAggregation t = TermsAggregation (Right t) Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing++mkDateHistogram :: FieldName -> Interval -> DateHistogramAggregation+mkDateHistogram t i = DateHistogramAggregation t i Nothing Nothing Nothing Nothing Nothing Nothing++instance ToJSON Version where+  toJSON Version {..} = object ["number" .= number+                               ,"build_hash" .= build_hash+                               ,"build_timestamp" .= build_timestamp+                               ,"build_snapshot" .= build_snapshot+                               ,"lucene_version" .= lucene_version]++instance FromJSON Version where+  parseJSON = withObject "Version" parse+    where parse o = Version+                    <$> o .: "number"+                    <*> o .: "build_hash"+                    <*> o .: "build_timestamp"+                    <*> o .: "build_snapshot"+                    <*> o .: "lucene_version"++instance ToJSON TermOrder where+  toJSON (TermOrder termSortField termSortOrder) = object [termSortField .= termSortOrder]++instance ToJSON TermInclusion where+  toJSON (TermInclusion x) = toJSON x+  toJSON (TermPattern pattern flags) = omitNulls [ "pattern" .= pattern,+                                                     "flags"   .= flags]++instance ToJSON CollectionMode where+  toJSON BreadthFirst = "breadth_first"+  toJSON DepthFirst   = "depth_first"++instance ToJSON ExecutionHint where+  toJSON Ordinals                     = "ordinals"+  toJSON GlobalOrdinals               = "global_ordinals"+  toJSON GlobalOrdinalsHash           = "global_ordinals_hash"+  toJSON GlobalOrdinalsLowCardinality = "global_ordinals_low_cardinality"+  toJSON Map                          = "map"++instance ToJSON Interval where+  toJSON Year = "year"+  toJSON Quarter = "quarter"+  toJSON Month = "month"+  toJSON Week = "week"+  toJSON Day = "day"+  toJSON Hour = "hour"+  toJSON Minute = "minute"+  toJSON Second = "second"+  toJSON (FractionalInterval fraction interval) = toJSON $ show fraction ++ show interval++instance Show TimeInterval where+  show Weeks    = "w"+  show Days     = "d"+  show Hours    = "h"+  show Minutes  = "m"+  show Seconds  = "s"++instance ToJSON Aggregation where+  toJSON (TermsAgg (TermsAggregation term include exclude order minDocCount size shardSize collectMode executionHint termAggs)) =+    omitNulls ["terms" .= omitNulls [ toJSON' term,+                                      "include"        .= include,+                                      "exclude"        .= exclude,+                                      "order"          .= order,+                                      "min_doc_count"  .= minDocCount,+                                      "size"           .= size,+                                      "shard_size"     .= shardSize,+                                      "collect_mode"   .= collectMode,+                                      "execution_hint" .= executionHint+                                    ],+               "aggs"  .= termAggs ]+    where+      toJSON' x = case x of { Left y -> "field" .= y;  Right y -> "script" .= y }++  toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =+    omitNulls ["date_histogram" .= omitNulls [ "field"       .= field,+                                               "interval"    .= interval,+                                               "format"      .= format,+                                               "pre_zone"    .= preZone,+                                               "post_zone"   .= postZone,+                                               "pre_offset"  .= preOffset,+                                               "post_offset" .= postOffset+                                             ],+               "aggs"           .= dateHistoAggs ]+  toJSON (ValueCountAgg a) = object ["value_count" .= v]+    where v = case a of+                (FieldValueCount (FieldName n)) -> object ["field" .= n]+                (ScriptValueCount (Script s))   -> object ["script" .= s]+  toJSON (FilterAgg (FilterAggregation filt ags)) =+    omitNulls [ "filter" .= filt+              , "aggs" .= ags]+  toJSON (DateRangeAgg a) = object [ "date_range" .= a+                                   ]++instance ToJSON DateRangeAggregation where+  toJSON DateRangeAggregation {..} =+    omitNulls [ "field" .= draField+              , "format" .= draFormat+              , "ranges" .= toList draRanges+              ]++instance ToJSON DateRangeAggRange where+  toJSON (DateRangeFrom e) = object [ "from" .= e ]+  toJSON (DateRangeTo e) = object [ "to" .= e ]+  toJSON (DateRangeFromAndTo f t) = object [ "from" .= f, "to" .= t ]++instance ToJSON DateMathExpr where+  toJSON (DateMathExpr a mods) = String (fmtA a <> mconcat (fmtMod <$> mods))+    where fmtA DMNow = "now"+          fmtA (DMDate date) = case toGregorian date of+                                 (y,m,d) -> showText y <> "-" <>+                                            showText m <> "-" <>+                                            showText d <> "||"+          fmtMod (AddTime n u) = "+" <> showText n <> fmtU u+          fmtMod (SubtractTime n u) = "-" <> showText n <> fmtU u+          fmtMod (RoundDownTo u) = "/" <> fmtU u+          fmtU DMYear = "y"+          fmtU DMMonth = "M"+          fmtU DMWeek = "w"+          fmtU DMDay = "d"+          fmtU DMHour = "h"+          fmtU DMMinute = "m"+          fmtU DMSecond = "s"+++type AggregationResults = M.Map Text Value++class BucketAggregation a where+  key :: a -> Text+  docCount :: a -> Int+  aggs :: a -> Maybe AggregationResults+++data Bucket a = Bucket { buckets :: [a]} deriving (Show)++data TermsResult = TermsResult { termKey       :: Text+                               , termsDocCount :: Int+                               , termsAggs     :: Maybe AggregationResults } deriving (Show)++data DateHistogramResult = DateHistogramResult { dateKey           :: Int+                                               , dateKeyStr        :: Maybe Text+                                               , dateDocCount      :: Int+                                               , dateHistogramAggs :: Maybe AggregationResults } deriving (Show)++data DateRangeResult = DateRangeResult { dateRangeKey          :: Text+                                       , dateRangeFrom         :: Maybe UTCTime+                                       , dateRangeFromAsString :: Maybe Text+                                       , dateRangeTo           :: Maybe UTCTime+                                       , dateRangeToAsString   :: Maybe Text+                                       , dateRangeDocCount     :: Int+                                       , dateRangeAggs         :: Maybe AggregationResults } deriving (Show, Eq, Generic, Typeable)++toTerms :: Text -> AggregationResults ->  Maybe (Bucket TermsResult)+toTerms t a = M.lookup t a >>= deserialize+  where deserialize = parseMaybe parseJSON++toDateHistogram :: Text -> AggregationResults -> Maybe (Bucket DateHistogramResult)+toDateHistogram t a = M.lookup t a >>= deserialize+  where deserialize = parseMaybe parseJSON++instance BucketAggregation TermsResult where+  key = termKey+  docCount = termsDocCount+  aggs = termsAggs++instance BucketAggregation DateHistogramResult where+  key = showText . dateKey+  docCount = dateDocCount+  aggs = dateHistogramAggs++instance BucketAggregation DateRangeResult where+  key = dateRangeKey+  docCount = dateRangeDocCount+  aggs = dateRangeAggs++instance (FromJSON a, BucketAggregation a) => FromJSON (Bucket a) where+  parseJSON (Object v) = Bucket <$>+                         v .: "buckets"+  parseJSON _ = mempty++instance FromJSON TermsResult where+  parseJSON (Object v) = TermsResult <$>+                         v .:   "key"       <*>+                         v .:   "doc_count" <*>+                         v .:?  "aggregations"+  parseJSON _ = mempty++instance FromJSON DateHistogramResult where+  parseJSON (Object v) = DateHistogramResult   <$>+                         v .:  "key"           <*>+                         v .:? "key_as_string" <*>+                         v .:  "doc_count"     <*>+                         v .:? "aggregations"+  parseJSON _ = mempty++instance FromJSON DateRangeResult where+  parseJSON = withObject "DateRangeResult" parse+    where parse v = DateRangeResult                 <$>+                    v .:  "key"                     <*>+                    (fmap posixMS <$> v .:? "from") <*>+                    v .:? "from_as_string"          <*>+                    (fmap posixMS <$> v .:? "to")   <*>+                    v .:? "to_as_string"            <*>+                    v .:  "doc_count"               <*>+                    v .:? "aggregations"++instance FromJSON POSIXMS where+  parseJSON = withScientific "POSIXMS" (return . parse)+    where parse n = let n' = truncate n :: Integer+                    in POSIXMS (posixSecondsToUTCTime (fromInteger (n' `div` 1000)))++instance Monoid Filter where+  mempty = IdentityFilter+  mappend a b = AndFilter [a, b] defaultCache++instance Seminearring Filter where+  a <||> b = OrFilter [a, b] defaultCache++instance ToJSON Filter where+  toJSON (AndFilter filters cache) =+    object ["and" .=+            object [ "filters" .= fmap toJSON filters+                   , "_cache"  .= cache]]++  toJSON (OrFilter filters cache) =+    object ["or" .=+            object [ "filters" .= fmap toJSON filters+                   , "_cache"  .= cache]]++  toJSON (NotFilter notFilter cache) =+    object ["not" .=+            object ["filter"  .= notFilter+                   , "_cache" .= cache]]++  toJSON (IdentityFilter) =+    object ["match_all" .= object []]++  toJSON (TermFilter (Term termFilterField termFilterValue) cache) =+    object ["term" .= object base]+    where base = [termFilterField .= termFilterValue,+                  "_cache"        .= cache]++  toJSON (ExistsFilter (FieldName fieldName)) =+    object ["exists"  .= object+            ["field"  .= fieldName]]++  toJSON (BoolFilter boolMatch) =+    object ["bool"    .= boolMatch]++  toJSON (GeoBoundingBoxFilter bbConstraint) =+    object ["geo_bounding_box" .= bbConstraint]++  toJSON (GeoDistanceFilter (GeoPoint (FieldName distanceGeoField) geoDistLatLon)+          distance distanceType optimizeBbox cache) =+    object ["geo_distance" .=+            object ["distance" .= distance+                   , "distance_type" .= distanceType+                   , "optimize_bbox" .= optimizeBbox+                   , distanceGeoField .= geoDistLatLon+                   , "_cache" .= cache]]++  toJSON (GeoDistanceRangeFilter (GeoPoint (FieldName gddrField) drLatLon)+          (DistanceRange geoDistRangeDistFrom drDistanceTo)) =+    object ["geo_distance_range" .=+            object ["from" .= geoDistRangeDistFrom+                   , "to"  .= drDistanceTo+                   , gddrField .= drLatLon]]++  toJSON (GeoPolygonFilter (FieldName geoPolygonFilterField) latLons) =+    object ["geo_polygon" .=+            object [geoPolygonFilterField .=+                    object ["points" .= fmap toJSON latLons]]]++  toJSON (IdsFilter (MappingName mappingName) values) =+    object ["ids" .=+            object ["type" .= mappingName+                   , "values" .= fmap unpackId values]]++  toJSON (LimitFilter limit) =+    object ["limit" .= object ["value" .= limit]]++  toJSON (MissingFilter (FieldName fieldName) (Existence existence) (NullValue nullValue)) =+    object ["missing" .=+            object ["field"       .= fieldName+                   , "existence"  .= existence+                   , "null_value" .= nullValue]]++  toJSON (PrefixFilter (FieldName fieldName) fieldValue cache) =+    object ["prefix" .=+            object [fieldName .= fieldValue+                   , "_cache" .= cache]]++  toJSON (QueryFilter query False) =+    object ["query" .= toJSON query ]+  toJSON (QueryFilter query True) =+    object ["fquery" .=+            object [ "query"  .= toJSON query+                   , "_cache" .= True ]]++  toJSON (RangeFilter (FieldName fieldName) rangeValue rangeExecution cache) =+    object ["range" .=+            object [ fieldName .= object (rangeValueToPair rangeValue)+                   , "execution" .= rangeExecution+                   , "_cache" .= cache]]++  toJSON (RegexpFilter (FieldName fieldName)+          (Regexp regexText) flags (CacheName cacheName) cache (CacheKey cacheKey)) =+    object ["regexp" .=+            object [fieldName .=+                    object ["value"  .= regexText+                           , "flags" .= flags]+                   , "_name"      .= cacheName+                   , "_cache"     .= cache+                   , "_cache_key" .= cacheKey]]++instance FromJSON Filter where+  parseJSON = withObject "Filter" parse+    where parse o = andFilter `taggedWith` "and"+                <|> orFilter `taggedWith` "or"+                <|> notFilter `taggedWith` "not"+                <|> identityFilter `taggedWith` "match_all"+                <|> boolFilter `taggedWith` "bool"+                <|> existsFilter `taggedWith` "exists"+                <|> geoBoundingBoxFilter `taggedWith` "geo_bounding_box"+                <|> geoDistanceFilter `taggedWith` "geo_distance"+                <|> geoDistanceRangeFilter `taggedWith` "geo_distance_range"+                <|> geoPolygonFilter `taggedWith` "geo_polygon"+                <|> idsFilter `taggedWith` "ids"+                <|> limitFilter `taggedWith` "limit"+                <|> missingFilter `taggedWith` "missing"+                <|> prefixFilter `taggedWith` "prefix"+                <|> queryFilter `taggedWith` "query"+                <|> fqueryFilter `taggedWith` "fquery"+                <|> rangeFilter `taggedWith` "range"+                <|> regexpFilter `taggedWith` "regexp"+                <|> termFilter `taggedWith` "term"+            where taggedWith parser k = parser =<< o .: k+          andFilter o = AndFilter <$> o .: "filters"+                                  <*> o .:? "_cache" .!= defaultCache+          orFilter o = OrFilter <$> o .: "filters"+                                <*> o .:? "_cache" .!= defaultCache+          notFilter o = NotFilter <$> o .: "filter"+                                  <*> o .: "_cache" .!= defaultCache+          identityFilter :: Object -> Parser Filter+          identityFilter m+            | HM.null m = pure IdentityFilter+            | otherwise = fail ("Identityfilter expected empty object but got " <> show m)+          boolFilter = pure . BoolFilter+          existsFilter o = ExistsFilter <$> o .: "field"+          geoBoundingBoxFilter = pure . GeoBoundingBoxFilter+          geoDistanceFilter o = do+            case HM.toList (deleteSeveral ["distance", "distance_type", "optimize_bbox", "_cache"] o) of+              [(fn, v)] -> do+                gp <- GeoPoint (FieldName fn) <$> parseJSON v+                GeoDistanceFilter gp <$> o .: "distance"+                                     <*> o .: "distance_type"+                                     <*> o .: "optimize_bbox"+                                     <*> o .:? "_cache" .!= defaultCache+              _ -> fail "Could not find GeoDistanceFilter field name"+          geoDistanceRangeFilter o = do+            case HM.toList (deleteSeveral ["from", "to"] o) of+              [(fn, v)] -> do+                gp <- GeoPoint (FieldName fn) <$> parseJSON v+                rng <- DistanceRange <$> o .: "from" <*> o .: "to"+                return (GeoDistanceRangeFilter gp rng)+              _ -> fail "Could not find GeoDistanceRangeFilter field name"+          geoPolygonFilter = fieldTagged $ \fn o -> GeoPolygonFilter fn <$> o .: "points"+          idsFilter o = IdsFilter <$> o .: "type"+                                  <*> o .: "values"+          limitFilter o = LimitFilter <$> o .: "value"+          missingFilter o = MissingFilter <$> o .: "field"+                                          <*> o .: "existence"+                                          <*> o .: "null_value"+          prefixFilter o = case HM.toList (HM.delete "_cache" o) of+                             [(fn, String v)] -> PrefixFilter (FieldName fn) v <$> o .:? "_cache" .!= defaultCache+                             _ -> fail "Could not parse PrefixFilter"++          queryFilter q = pure (QueryFilter q False)+          fqueryFilter o = QueryFilter <$> o .: "query" <*> pure True+          rangeFilter o = case HM.toList (deleteSeveral ["execution", "_cache"] o) of+                            [(fn, v)] -> RangeFilter (FieldName fn)+                                         <$> parseJSON v+                                         <*> o .: "execution"+                                         <*> o .:? "_cache" .!= defaultCache+                            _ -> fail "Could not find field name for RangeFilter"+          regexpFilter o = case HM.toList (deleteSeveral ["_name", "_cache", "_cache_key"] o) of+                              [(fn, Object o')] -> RegexpFilter (FieldName fn)+                                                   <$> o' .: "value"+                                                   <*> o' .: "flags"+                                                   <*> o .: "_name"+                                                   <*> o .:? "_cache" .!= defaultCache+                                                   <*> o .: "_cache_key"+                              _ -> fail "Could not find field name for RegexpFilter"+          termFilter o = case HM.toList (HM.delete "_cache" o) of+                         [(termField, String termVal)] -> TermFilter (Term termField termVal)+                                                          <$> o .:? "_cache" .!= defaultCache+                         _ -> fail "Could not find term field for TermFilter"++fieldTagged :: Monad m => (FieldName -> Object -> m a) -> Object -> m a+fieldTagged f o = case HM.toList o of+                    [(k, Object o')] -> f (FieldName k) o'+                    _ -> fail "Expected object with 1 field-named key"++instance ToJSON GeoPoint where+  toJSON (GeoPoint (FieldName geoPointField) geoPointLatLon) =+    object [ geoPointField  .= geoPointLatLon ]+++instance ToJSON Query where+  toJSON (TermQuery (Term termQueryField termQueryValue) boost) =+    object [ "term" .=+             object [termQueryField .= object merged]]+    where+      base = [ "value" .= termQueryValue ]+      boosted = maybe [] (return . ("boost" .=)) boost+      merged = mappend base boosted++  toJSON (TermsQuery fieldName terms) =+    object [ "terms" .= object conjoined ]+    where conjoined = [fieldName .= terms]+  toJSON (IdsQuery idsQueryMappingName docIds) =+    object [ "ids" .= object conjoined ]+    where conjoined = [ "type"   .= idsQueryMappingName+                      , "values" .= fmap toJSON docIds ]++  toJSON (QueryQueryStringQuery qQueryStringQuery) =+    object [ "query_string" .= qQueryStringQuery ]++  toJSON (QueryMatchQuery matchQuery) =+    object [ "match" .= matchQuery ]++  toJSON (QueryMultiMatchQuery multiMatchQuery) =+      toJSON multiMatchQuery++  toJSON (QueryBoolQuery boolQuery) =+    object [ "bool" .= boolQuery ]++  toJSON (QueryBoostingQuery boostingQuery) =+    object [ "boosting" .= boostingQuery ]++  toJSON (QueryCommonTermsQuery commonTermsQuery) =+    object [ "common" .= commonTermsQuery ]++  toJSON (ConstantScoreFilter csFilter boost) =+    object ["constant_score" .= object ["filter" .= csFilter+                                       , "boost" .= boost]]++  toJSON (ConstantScoreQuery query boost) =+    object ["constant_score" .= object ["query" .= query+                                       , "boost" .= boost]]++  toJSON (QueryDisMaxQuery disMaxQuery) =+    object [ "dis_max" .= disMaxQuery ]++  toJSON (QueryFilteredQuery qFilteredQuery) =+    object [ "filtered" .= qFilteredQuery ]++  toJSON (QueryFuzzyLikeThisQuery fuzzyQuery) =+    object [ "fuzzy_like_this" .= fuzzyQuery ]++  toJSON (QueryFuzzyLikeFieldQuery fuzzyFieldQuery) =+    object [ "fuzzy_like_this_field" .= fuzzyFieldQuery ]++  toJSON (QueryFuzzyQuery fuzzyQuery) =+    object [ "fuzzy" .= fuzzyQuery ]++  toJSON (QueryHasChildQuery childQuery) =+    object [ "has_child" .= childQuery ]++  toJSON (QueryHasParentQuery parentQuery) =+    object [ "has_parent" .= parentQuery ]++  toJSON (QueryIndicesQuery qIndicesQuery) =+    object [ "indices" .= qIndicesQuery ]++  toJSON (MatchAllQuery boost) =+    object [ "match_all" .= omitNulls [ "boost" .= boost ] ]++  toJSON (QueryMoreLikeThisQuery query) =+    object [ "more_like_this" .= query ]++  toJSON (QueryMoreLikeThisFieldQuery query) =+    object [ "more_like_this_field" .= query ]++  toJSON (QueryNestedQuery query) =+    object [ "nested" .= query ]++  toJSON (QueryPrefixQuery query) =+    object [ "prefix" .= query ]++  toJSON (QueryRangeQuery query) =+    object [ "range"  .= query ]++  toJSON (QueryRegexpQuery query) =+    object [ "regexp" .= query ]++  toJSON (QuerySimpleQueryStringQuery query) =+    object [ "simple_query_string" .= query ]++instance FromJSON Query where+  parseJSON v = withObject "Query" parse v+    where parse o = termQuery `taggedWith` "term"+                <|> termsQuery `taggedWith` "terms"+                <|> idsQuery `taggedWith` "ids"+                <|> queryQueryStringQuery `taggedWith` "query_string"+                <|> queryMatchQuery `taggedWith` "match"+                <|> queryMultiMatchQuery+                <|> queryBoolQuery `taggedWith` "bool"+                <|> queryBoostingQuery `taggedWith` "boosting"+                <|> queryCommonTermsQuery `taggedWith` "common"+                <|> constantScoreFilter `taggedWith` "constant_score"+                <|> constantScoreQuery `taggedWith` "constant_score"+                <|> queryDisMaxQuery `taggedWith` "dis_max"+                <|> queryFilteredQuery `taggedWith` "filtered"+                <|> queryFuzzyLikeThisQuery `taggedWith` "fuzzy_like_this"+                <|> queryFuzzyLikeFieldQuery `taggedWith` "fuzzy_like_this_field"+                <|> queryFuzzyQuery `taggedWith` "fuzzy"+                <|> queryHasChildQuery `taggedWith` "has_child"+                <|> queryHasParentQuery `taggedWith` "has_parent"+                <|> queryIndicesQuery `taggedWith` "indices"+                <|> matchAllQuery `taggedWith` "match_all"+                <|> queryMoreLikeThisQuery `taggedWith` "more_like_this"+                <|> queryMoreLikeThisFieldQuery `taggedWith` "more_like_this_field"+                <|> queryNestedQuery `taggedWith` "nested"+                <|> queryPrefixQuery `taggedWith` "prefix"+                <|> queryRangeQuery `taggedWith` "range"+                <|> queryRegexpQuery `taggedWith` "regexp"+                <|> querySimpleQueryStringQuery `taggedWith` "simple_query_string"+            where taggedWith parser k = parser =<< o .: k+          termQuery = fieldTagged $ \(FieldName fn) o ->+                        TermQuery <$> (Term fn <$> o .: "value") <*> o .:? "boost"+          termsQuery o = case HM.toList o of+                           [(fn, vs)] -> do vals <- parseJSON vs+                                            case vals of+                                              x:xs -> return (TermsQuery fn (x :| xs))+                                              _ -> fail "Expected non empty list of values"+                           _ -> fail "Expected object with 1 field-named key"+          idsQuery o = IdsQuery <$> o .: "type"+                                <*> o .: "values"+          queryQueryStringQuery = pure . QueryQueryStringQuery+          queryMatchQuery = pure . QueryMatchQuery+          queryMultiMatchQuery = QueryMultiMatchQuery <$> parseJSON v+          queryBoolQuery = pure . QueryBoolQuery+          queryBoostingQuery = pure . QueryBoostingQuery+          queryCommonTermsQuery = pure . QueryCommonTermsQuery+          constantScoreFilter o = case HM.lookup "filter" o of+            Just x -> ConstantScoreFilter <$> parseJSON x+                                          <*> o .: "boost"+            _ -> fail "Does not appear to be a ConstantScoreFilter"+          constantScoreQuery o = case HM.lookup "query" o of+            Just x -> ConstantScoreQuery <$> parseJSON x+                                         <*> o .: "boost"+            _ -> fail "Does not appear to be a ConstantScoreQuery"+          queryDisMaxQuery = pure . QueryDisMaxQuery+          queryFilteredQuery = pure . QueryFilteredQuery+          queryFuzzyLikeThisQuery = pure . QueryFuzzyLikeThisQuery+          queryFuzzyLikeFieldQuery = pure . QueryFuzzyLikeFieldQuery+          queryFuzzyQuery = pure . QueryFuzzyQuery+          queryHasChildQuery = pure . QueryHasChildQuery+          queryHasParentQuery = pure . QueryHasParentQuery+          queryIndicesQuery = pure . QueryIndicesQuery+          matchAllQuery o = MatchAllQuery <$> o .:? "boost"+          queryMoreLikeThisQuery = pure . QueryMoreLikeThisQuery+          queryMoreLikeThisFieldQuery = pure . QueryMoreLikeThisFieldQuery+          queryNestedQuery = pure . QueryNestedQuery+          queryPrefixQuery = pure . QueryPrefixQuery+          queryRangeQuery = pure . QueryRangeQuery+          queryRegexpQuery = pure . QueryRegexpQuery+          querySimpleQueryStringQuery = pure . QuerySimpleQueryStringQuery+++omitNulls :: [(Text, Value)] -> Value+omitNulls = object . filter notNull where+  notNull (_, Null)      = False+  notNull (_, Array a) = (not . V.null) a+  notNull _              = True+++instance ToJSON SimpleQueryStringQuery where+  toJSON SimpleQueryStringQuery {..} =+    omitNulls (base ++ maybeAdd)+    where base = [ "query" .= simpleQueryStringQuery ]+          maybeAdd = [ "fields" .= simpleQueryStringField+                     , "default_operator" .= simpleQueryStringOperator+                     , "analyzer" .= simpleQueryStringAnalyzer+                     , "flags" .= simpleQueryStringFlags+                     , "lowercase_expanded_terms" .= simpleQueryStringLowercaseExpanded+                     , "locale" .= simpleQueryStringLocale ]++instance FromJSON SimpleQueryStringQuery where+  parseJSON = withObject "SimpleQueryStringQuery" parse+    where parse o = SimpleQueryStringQuery <$> o .: "query"+                                           <*> o .:? "fields"+                                           <*> o .:? "default_operator"+                                           <*> o .:? "analyzer"+                                           <*> (parseFlags <$> o .:? "flags")+                                           <*> o .:? "lowercase_expanded_terms"+                                           <*> o .:? "locale"+          parseFlags (Just (x:xs)) = Just (x :| xs)+          parseFlags _             = Nothing++instance ToJSON FieldOrFields where+  toJSON (FofField fieldName) =+    toJSON fieldName+  toJSON (FofFields fieldNames) =+    toJSON fieldNames++instance FromJSON FieldOrFields where+  parseJSON v = FofField  <$> parseJSON v+            <|> FofFields <$> (parseNEJSON =<< parseJSON v)++instance ToJSON SimpleQueryFlag where+  toJSON SimpleQueryAll        = "ALL"+  toJSON SimpleQueryNone       = "NONE"+  toJSON SimpleQueryAnd        = "AND"+  toJSON SimpleQueryOr         = "OR"+  toJSON SimpleQueryPrefix     = "PREFIX"+  toJSON SimpleQueryPhrase     = "PHRASE"+  toJSON SimpleQueryPrecedence = "PRECEDENCE"+  toJSON SimpleQueryEscape     = "ESCAPE"+  toJSON SimpleQueryWhitespace = "WHITESPACE"+  toJSON SimpleQueryFuzzy      = "FUZZY"+  toJSON SimpleQueryNear       = "NEAR"+  toJSON SimpleQuerySlop       = "SLOP"++instance FromJSON SimpleQueryFlag where+  parseJSON = withText "SimpleQueryFlag" parse+    where parse "ALL"        = pure SimpleQueryAll+          parse "NONE"       = pure SimpleQueryNone+          parse "AND"        = pure SimpleQueryAnd+          parse "OR"         = pure SimpleQueryOr+          parse "PREFIX"     = pure SimpleQueryPrefix+          parse "PHRASE"     = pure SimpleQueryPhrase+          parse "PRECEDENCE" = pure SimpleQueryPrecedence+          parse "ESCAPE"     = pure SimpleQueryEscape+          parse "WHITESPACE" = pure SimpleQueryWhitespace+          parse "FUZZY"      = pure SimpleQueryFuzzy+          parse "NEAR"       = pure SimpleQueryNear+          parse "SLOP"       = pure SimpleQuerySlop+          parse f            = fail ("Unexpected SimpleQueryFlag: " <> show f)++instance ToJSON RegexpQuery where+  toJSON (RegexpQuery (FieldName rqQueryField)+          (Regexp regexpQueryQuery) rqQueryFlags+          rqQueryBoost) =+   object [ rqQueryField .= omitNulls base ]+   where base = [ "value" .= regexpQueryQuery+                , "flags" .= rqQueryFlags+                , "boost" .= rqQueryBoost ]++instance FromJSON RegexpQuery where+  parseJSON = withObject "RegexpQuery" parse+    where parse = fieldTagged $ \fn o ->+                    RegexpQuery fn+                    <$> o .: "value"+                    <*> o .: "flags"+                    <*> o .:? "boost"++instance ToJSON QueryStringQuery where+  toJSON (QueryStringQuery qsQueryString+          qsDefaultField qsOperator+          qsAnalyzer qsAllowWildcard+          qsLowercaseExpanded  qsEnablePositionIncrements+          qsFuzzyMaxExpansions qsFuzziness+          qsFuzzyPrefixLength qsPhraseSlop+          qsBoost qsAnalyzeWildcard+          qsGeneratePhraseQueries qsMinimumShouldMatch+          qsLenient qsLocale) =+    omitNulls base+    where+      base = [ "query" .= qsQueryString+             , "default_field" .= qsDefaultField+             , "default_operator" .= qsOperator+             , "analyzer" .= qsAnalyzer+             , "allow_leading_wildcard" .= qsAllowWildcard+             , "lowercase_expanded_terms" .= qsLowercaseExpanded+             , "enable_position_increments" .= qsEnablePositionIncrements+             , "fuzzy_max_expansions" .= qsFuzzyMaxExpansions+             , "fuzziness" .= qsFuzziness+             , "fuzzy_prefix_length" .= qsFuzzyPrefixLength+             , "phrase_slop" .= qsPhraseSlop+             , "boost" .= qsBoost+             , "analyze_wildcard" .= qsAnalyzeWildcard+             , "auto_generate_phrase_queries" .= qsGeneratePhraseQueries+             , "minimum_should_match" .= qsMinimumShouldMatch+             , "lenient" .= qsLenient+             , "locale" .= qsLocale ]++instance FromJSON QueryStringQuery where+  parseJSON = withObject "QueryStringQuery" parse+    where parse o = QueryStringQuery+                    <$> o .: "query"+                    <*> o .:? "default_field"+                    <*> o .:? "default_operator"+                    <*> o .:? "analyzer"+                    <*> o .:? "allow_leading_wildcard"+                    <*> o .:? "lowercase_expanded_terms"+                    <*> o .:? "enable_position_increments"+                    <*> o .:? "fuzzy_max_expansions"+                    <*> o .:? "fuzziness"+                    <*> o .:? "fuzzy_prefix_length"+                    <*> o .:? "phrase_slop"+                    <*> o .:? "boost"+                    <*> o .:? "analyze_wildcard"+                    <*> o .:? "auto_generate_phrase_queries"+                    <*> o .:? "minimum_should_match"+                    <*> o .:? "lenient"+                    <*> o .:? "locale"++instance ToJSON RangeQuery where+  toJSON (RangeQuery (FieldName fieldName) range boost) =+    object [ fieldName .= object conjoined ]+    where conjoined = [ "boost" .= boost ] ++ (rangeValueToPair range)++instance FromJSON RangeQuery where+  parseJSON = withObject "RangeQuery" parse+    where parse = fieldTagged $ \fn o ->+                    RangeQuery fn+                    <$> parseJSON (Object o)+                    <*> o .: "boost"++instance FromJSON RangeValue where+  parseJSON = withObject "RangeValue" parse+    where parse o = parseDate o+                <|> parseDouble o+          parseDate o = do lt <- o .:? "lt"+                           lte <- o .:? "lte"+                           gt <- o .:? "gt"+                           gte <- o .:? "gte"+                           case (lt, lte, gt, gte) of+                             (Just a, _, Just b, _) -> return (RangeDateGtLt (GreaterThanD b) (LessThanD a))+                             (Just a, _, _, Just b)-> return (RangeDateGteLt (GreaterThanEqD b) (LessThanD a))+                             (_, Just a, Just b, _)-> return (RangeDateGtLte (GreaterThanD b) (LessThanEqD a))+                             (_, Just a, _, Just b)-> return (RangeDateGteLte (GreaterThanEqD b) (LessThanEqD a))+                             (_, _, Just a, _)-> return (RangeDateGt (GreaterThanD a))+                             (Just a, _, _, _)-> return (RangeDateLt (LessThanD a))+                             (_, _, _, Just a)-> return (RangeDateGte (GreaterThanEqD a))+                             (_, Just a, _, _)-> return (RangeDateLte (LessThanEqD a))+                             (Nothing, Nothing, Nothing, Nothing) -> mzero+          parseDouble o = do lt <- o .:? "lt"+                             lte <- o .:? "lte"+                             gt <- o .:? "gt"+                             gte <- o .:? "gte"+                             case (lt, lte, gt, gte) of+                               (Just a, _, Just b, _) -> return (RangeDoubleGtLt (GreaterThan b) (LessThan a))+                               (Just a, _, _, Just b)-> return (RangeDoubleGteLt (GreaterThanEq b) (LessThan a))+                               (_, Just a, Just b, _)-> return (RangeDoubleGtLte (GreaterThan b) (LessThanEq a))+                               (_, Just a, _, Just b)-> return (RangeDoubleGteLte (GreaterThanEq b) (LessThanEq a))+                               (_, _, Just a, _)-> return (RangeDoubleGt (GreaterThan a))+                               (Just a, _, _, _)-> return (RangeDoubleLt (LessThan a))+                               (_, _, _, Just a)-> return (RangeDoubleGte (GreaterThanEq a))+                               (_, Just a, _, _)-> return (RangeDoubleLte (LessThanEq a))+                               (Nothing, Nothing, Nothing, Nothing) -> mzero++instance ToJSON PrefixQuery where+  toJSON (PrefixQuery (FieldName fieldName) queryValue boost) =+    object [ fieldName .= omitNulls base ]+    where base = [ "value" .= queryValue+                 , "boost" .= boost ]++instance FromJSON PrefixQuery where+  parseJSON = withObject "PrefixQuery" parse+    where parse = fieldTagged $ \fn o ->+                    PrefixQuery fn+                    <$> o .: "value"+                    <*> o .:? "boost"++instance ToJSON NestedQuery where+  toJSON (NestedQuery nqPath nqScoreType nqQuery) =+    object [ "path"       .= nqPath+           , "score_mode" .= nqScoreType+           , "query"      .= nqQuery ]++instance FromJSON NestedQuery where+  parseJSON = withObject "NestedQuery" parse+    where parse o = NestedQuery+                    <$> o .: "path"+                    <*> o .: "score_mode"+                    <*> o .: "query"++instance ToJSON MoreLikeThisFieldQuery where+  toJSON (MoreLikeThisFieldQuery text (FieldName fieldName)+          percent mtf mqt stopwords mindf maxdf+          minwl maxwl boostTerms boost analyzer) =+    object [ fieldName .= omitNulls base ]+    where base = [ "like_text" .= text+                 , "percent_terms_to_match" .= percent+                 , "min_term_freq" .= mtf+                 , "max_query_terms" .= mqt+                 , "stop_words" .= stopwords+                 , "min_doc_freq" .= mindf+                 , "max_doc_freq" .= maxdf+                 , "min_word_length" .= minwl+                 , "max_word_length" .= maxwl+                 , "boost_terms" .= boostTerms+                 , "boost" .= boost+                 , "analyzer" .= analyzer ]++instance FromJSON MoreLikeThisFieldQuery where+  parseJSON = withObject "MoreLikeThisFieldQuery" parse+    where parse = fieldTagged $ \fn o ->+                    MoreLikeThisFieldQuery+                    <$> o .: "like_text"+                    <*> pure fn+                    <*> o .:? "percent_terms_to_match"+                    <*> o .:? "min_term_freq"+                    <*> o .:? "max_query_terms"+                    <*> (optionalNE =<< o .:? "stop_words")+                    <*> o .:? "min_doc_freq"+                    <*> o .:? "max_doc_freq"+                    <*> o .:? "min_word_length"+                    <*> o .:? "max_word_length"+                    <*> o .:? "boost_terms"+                    <*> o .:? "boost"+                    <*> o .:? "analyzer"+          optionalNE = maybe (pure Nothing) (fmap Just . parseNEJSON)++instance ToJSON MoreLikeThisQuery where+  toJSON (MoreLikeThisQuery text fields percent+          mtf mqt stopwords mindf maxdf+          minwl maxwl boostTerms boost analyzer) =+    omitNulls base+    where base = [ "like_text" .= text+                 , "fields" .= fields+                 , "percent_terms_to_match" .= percent+                 , "min_term_freq" .= mtf+                 , "max_query_terms" .= mqt+                 , "stop_words" .= stopwords+                 , "min_doc_freq" .= mindf+                 , "max_doc_freq" .= maxdf+                 , "min_word_length" .= minwl+                 , "max_word_length" .= maxwl+                 , "boost_terms" .= boostTerms+                 , "boost" .= boost+                 , "analyzer" .= analyzer ]++instance FromJSON MoreLikeThisQuery where+  parseJSON = withObject "MoreLikeThisQuery" parse+    where parse o = MoreLikeThisQuery+                    <$> o .: "like_text"+                    <*> (optionalNE =<< o .:? "fields")+                    <*> o .:? "percent_terms_to_match"+                    <*> o .:? "min_term_freq"+                    <*> o .:? "max_query_terms"+                    <*> (optionalNE =<< o .:? "stop_words")+                    <*> o .:? "min_doc_freq"+                    <*> o .:? "max_doc_freq"+                    <*> o .:? "min_word_length"+                    <*> o .:? "max_word_length"+                    <*> o .:? "boost_terms"+                    <*> o .:? "boost"+                    <*> o .:? "analyzer"+          optionalNE = maybe (pure Nothing) (fmap Just . parseNEJSON)++instance ToJSON IndicesQuery where+  toJSON (IndicesQuery indices query noMatch) =+    omitNulls [ "indices" .= indices+              , "no_match_query" .= noMatch+              , "query" .= query ]++instance FromJSON IndicesQuery where+  parseJSON = withObject "IndicesQuery" parse+    where parse o = IndicesQuery+                    <$> o .:? "indices" .!= []+                    <*> o .: "query"+                    <*> o .:? "no_match_query"++instance ToJSON HasParentQuery where+  toJSON (HasParentQuery queryType query scoreType) =+    omitNulls [ "parent_type" .= queryType+              , "score_type" .= scoreType+              , "query" .= query ]++instance FromJSON HasParentQuery where+  parseJSON = withObject "HasParentQuery" parse+    where parse o = HasParentQuery+                    <$> o .: "parent_type"+                    <*> o .: "query"+                    <*> o .:? "score_type"++instance ToJSON HasChildQuery where+  toJSON (HasChildQuery queryType query scoreType) =+    omitNulls [ "query" .= query+              , "score_type" .= scoreType+              , "type"  .= queryType ]++instance FromJSON HasChildQuery where+  parseJSON = withObject "HasChildQuery" parse+    where parse o = HasChildQuery+                    <$> o .: "type"+                    <*> o .: "query"+                    <*> o .:? "score_type"++instance ToJSON FuzzyQuery where+  toJSON (FuzzyQuery (FieldName fieldName) queryText+          prefixLength maxEx fuzziness boost) =+    object [ fieldName .= omitNulls base ]+    where base = [ "value"          .= queryText+                 , "fuzziness"      .= fuzziness+                 , "prefix_length"  .= prefixLength+                 , "boost" .= boost+                 , "max_expansions" .= maxEx ]++instance FromJSON FuzzyQuery where+  parseJSON = withObject "FuzzyQuery" parse+    where parse = fieldTagged $ \fn o ->+                    FuzzyQuery fn+                    <$> o .: "value"+                    <*> o .: "prefix_length"+                    <*> o .: "max_expansions"+                    <*> o .: "fuzziness"+                    <*> o .:? "boost"++instance ToJSON FuzzyLikeFieldQuery where+  toJSON (FuzzyLikeFieldQuery (FieldName fieldName)+          fieldText maxTerms ignoreFreq fuzziness prefixLength+          boost analyzer) =+    object [ fieldName .=+             omitNulls [ "like_text"       .= fieldText+                       , "max_query_terms" .= maxTerms+                       , "ignore_tf"       .= ignoreFreq+                       , "fuzziness"       .= fuzziness+                       , "prefix_length"   .= prefixLength+                       , "analyzer" .= analyzer+                       , "boost"           .= boost ]]++instance FromJSON FuzzyLikeFieldQuery where+  parseJSON = withObject "FuzzyLikeFieldQuery" parse+    where parse = fieldTagged $ \fn o ->+                    FuzzyLikeFieldQuery fn+                    <$> o .: "like_text"+                    <*> o .: "max_query_terms"+                    <*> o .: "ignore_tf"+                    <*> o .: "fuzziness"+                    <*> o .: "prefix_length"+                    <*> o .: "boost"+                    <*> o .:? "analyzer"++instance ToJSON FuzzyLikeThisQuery where+  toJSON (FuzzyLikeThisQuery fields text maxTerms+          ignoreFreq fuzziness prefixLength boost analyzer) =+    omitNulls base+    where base = [ "fields"          .= fields+                 , "like_text"       .= text+                 , "max_query_terms" .= maxTerms+                 , "ignore_tf"       .= ignoreFreq+                 , "fuzziness"       .= fuzziness+                 , "prefix_length"   .= prefixLength+                 , "analyzer"        .= analyzer+                 , "boost"           .= boost ]++instance FromJSON FuzzyLikeThisQuery where+  parseJSON = withObject "FuzzyLikeThisQuery" parse+    where parse o = FuzzyLikeThisQuery+                    <$> o .:? "fields" .!= []+                    <*> o .: "like_text"+                    <*> o .: "max_query_terms"+                    <*> o .: "ignore_tf"+                    <*> o .: "fuzziness"+                    <*> o .: "prefix_length"+                    <*> o .: "boost"+                    <*> o .:? "analyzer"++instance ToJSON FilteredQuery where+  toJSON (FilteredQuery query fFilter) =+    object [ "query"  .= query+           , "filter" .= fFilter ]++instance FromJSON FilteredQuery where+  parseJSON = withObject "FilteredQuery" parse+    where parse o = FilteredQuery+                    <$> o .: "query"+                    <*> o .: "filter"++instance ToJSON DisMaxQuery where+  toJSON (DisMaxQuery queries tiebreaker boost) =+    omitNulls base+    where base = [ "queries"     .= queries+                 , "boost"       .= boost+                 , "tie_breaker" .= tiebreaker ]++instance FromJSON DisMaxQuery where+  parseJSON = withObject "DisMaxQuery" parse+    where parse o = DisMaxQuery+                    <$> o .:? "queries" .!= []+                    <*> o .: "tie_breaker"+                    <*> o .:? "boost"++instance ToJSON CommonTermsQuery where+  toJSON (CommonTermsQuery (FieldName fieldName)+          (QueryString query) cf lfo hfo msm+          boost analyzer disableCoord) =+    object [fieldName .= omitNulls base ]+    where base = [ "query"              .= query+                 , "cutoff_frequency"   .= cf+                 , "low_freq_operator"  .= lfo+                 , "minimum_should_match" .= msm+                 , "boost" .= boost+                 , "analyzer" .= analyzer+                 , "disable_coord" .= disableCoord+                 , "high_freq_operator" .= hfo ]++instance FromJSON CommonTermsQuery where+  parseJSON = withObject "CommonTermsQuery" parse+    where parse = fieldTagged $ \fn o ->+                    CommonTermsQuery fn+                    <$> o .: "query"+                    <*> o .: "cutoff_frequency"+                    <*> o .: "low_freq_operator"+                    <*> o .: "high_freq_operator"+                    <*> o .:? "minimum_should_match"+                    <*> o .:? "boost"+                    <*> o .:? "analyzer"+                    <*> o .:? "disable_coord"++instance ToJSON CommonMinimumMatch where+  toJSON (CommonMinimumMatch mm) = toJSON mm+  toJSON (CommonMinimumMatchHighLow (MinimumMatchHighLow lowF highF)) =+    object [ "low_freq"  .= lowF+           , "high_freq" .= highF ]++instance FromJSON CommonMinimumMatch where+  parseJSON v = parseMinimum v+            <|> parseMinimumHighLow v+    where parseMinimum = fmap CommonMinimumMatch . parseJSON+          parseMinimumHighLow = fmap CommonMinimumMatchHighLow . withObject "CommonMinimumMatchHighLow" (\o ->+                                  MinimumMatchHighLow+                                  <$> o .: "low_freq"+                                  <*> o .: "high_freq")+++instance ToJSON BoostingQuery where+  toJSON (BoostingQuery bqPositiveQuery bqNegativeQuery bqNegativeBoost) =+    object [ "positive"       .= bqPositiveQuery+           , "negative"       .= bqNegativeQuery+           , "negative_boost" .= bqNegativeBoost ]++instance FromJSON BoostingQuery where+  parseJSON = withObject "BoostingQuery" parse+    where parse o = BoostingQuery+                    <$> o .: "positive"+                    <*> o .: "negative"+                    <*> o .: "negative_boost"++instance ToJSON BoolQuery where+  toJSON (BoolQuery mustM notM shouldM bqMin boost disableCoord) =+    omitNulls base+    where base = [ "must" .= mustM+                 , "must_not" .= notM+                 , "should" .= shouldM+                 , "minimum_should_match" .= bqMin+                 , "boost" .= boost+                 , "disable_coord" .= disableCoord ]++instance FromJSON BoolQuery where+  parseJSON = withObject "BoolQuery" parse+    where parse o = BoolQuery+                    <$> o .:? "must" .!= []+                    <*> o .:? "must_not" .!= []+                    <*> o .:? "should" .!= []+                    <*> o .:? "minimum_should_match"+                    <*> o .:? "boost"+                    <*> o .:? "disable_coord"++instance ToJSON MatchQuery where+  toJSON (MatchQuery (FieldName fieldName)+          (QueryString mqQueryString) booleanOperator+          zeroTermsQuery cutoffFrequency matchQueryType+          analyzer maxExpansions lenient boost) =+    object [ fieldName .= omitNulls base ]+    where base = [ "query" .= mqQueryString+                 , "operator" .= booleanOperator+                 , "zero_terms_query" .= zeroTermsQuery+                 , "cutoff_frequency" .= cutoffFrequency+                 , "type" .= matchQueryType+                 , "analyzer" .= analyzer+                 , "max_expansions" .= maxExpansions+                 , "lenient" .= lenient+                 , "boost" .= boost ]++instance FromJSON MatchQuery where+  parseJSON = withObject "MatchQuery" parse+    where parse = fieldTagged $ \fn o ->+                    MatchQuery fn+                    <$> o .:  "query"+                    <*> o .:  "operator"+                    <*> o .:  "zero_terms_query"+                    <*> o .:? "cutoff_frequency"+                    <*> o .:? "type"+                    <*> o .:? "analyzer"+                    <*> o .:? "max_expansions"+                    <*> o .:? "lenient"+                    <*> o .:? "boost"++instance ToJSON MultiMatchQuery where+  toJSON (MultiMatchQuery fields (QueryString query) boolOp+          ztQ tb mmqt cf analyzer maxEx lenient) =+    object ["multi_match" .= omitNulls base]+    where base = [ "fields" .= fmap toJSON fields+                 , "query" .= query+                 , "operator" .= boolOp+                 , "zero_terms_query" .= ztQ+                 , "tiebreaker" .= tb+                 , "type" .= mmqt+                 , "cutoff_frequency" .= cf+                 , "analyzer" .= analyzer+                 , "max_expansions" .= maxEx+                 , "lenient" .= lenient ]++instance FromJSON MultiMatchQuery where+  parseJSON = withObject "MultiMatchQuery" parse+    where parse raw = do o <- raw .: "multi_match"+                         MultiMatchQuery+                           <$> o .:? "fields" .!= []+                           <*> o .: "query"+                           <*> o .: "operator"+                           <*> o .: "zero_terms_query"+                           <*> o .:? "tiebreaker"+                           <*> o .:? "type"+                           <*> o .:? "cutoff_frequency"+                           <*> o .:? "analyzer"+                           <*> o .:? "max_expansions"+                           <*> o .:? "lenient"++instance ToJSON MultiMatchQueryType where+  toJSON MultiMatchBestFields = "best_fields"+  toJSON MultiMatchMostFields = "most_fields"+  toJSON MultiMatchCrossFields = "cross_fields"+  toJSON MultiMatchPhrase = "phrase"+  toJSON MultiMatchPhrasePrefix = "phrase_prefix"++instance FromJSON MultiMatchQueryType where+  parseJSON = withText "MultiMatchPhrasePrefix" parse+    where parse "best_fields"   = pure MultiMatchBestFields+          parse "most_fields"   = pure MultiMatchMostFields+          parse "cross_fields"  = pure MultiMatchCrossFields+          parse "phrase"        = pure MultiMatchPhrase+          parse "phrase_prefix" = pure MultiMatchPhrasePrefix+          parse t = fail ("Unexpected MultiMatchPhrasePrefix: " <> show t)++instance ToJSON BooleanOperator where+  toJSON And = String "and"+  toJSON Or = String "or"++instance FromJSON BooleanOperator where+  parseJSON = withText "BooleanOperator" parse+    where parse "and" = pure And+          parse "or"  = pure Or+          parse o     = fail ("Unexpected BooleanOperator: " <> show o)++instance ToJSON ZeroTermsQuery where+  toJSON ZeroTermsNone = String "none"+  toJSON ZeroTermsAll  = String "all"++instance FromJSON ZeroTermsQuery where+  parseJSON = withText "ZeroTermsQuery" parse+    where parse "none" = pure ZeroTermsNone+          parse "all"  = pure ZeroTermsAll+          parse q      = fail ("Unexpected ZeroTermsQuery: " <> show q)++instance ToJSON MatchQueryType where+  toJSON MatchPhrase = "phrase"+  toJSON MatchPhrasePrefix = "phrase_prefix"++instance FromJSON MatchQueryType where+  parseJSON = withText "MatchQueryType" parse+    where parse "phrase"        = pure MatchPhrase+          parse "phrase_prefix" = pure MatchPhrasePrefix+          parse t               = fail ("Unexpected MatchQueryType: " <> show t)++instance FromJSON Status where+  parseJSON (Object v) = Status <$>+                         v .:? "ok" <*>+                         v .: "status" <*>+                         v .: "name" <*>+                         v .: "version" <*>+                         v .: "tagline"+  parseJSON _          = empty+++instance ToJSON IndexSettings where+  toJSON (IndexSettings s r) = object ["settings" .=+                                 object ["index" .=+                                   object ["number_of_shards" .= s, "number_of_replicas" .= r]+                                 ]+                               ]++instance FromJSON IndexSettings where+  parseJSON = withObject "IndexSettings" parse+    where parse o = do s <- o .: "settings"+                       i <- s .: "index"+                       IndexSettings <$> i .: "number_of_shards"+                                     <*> i .: "number_of_replicas"++instance ToJSON UpdatableIndexSetting where+  toJSON (NumberOfReplicas x) = oPath ("index" :| ["number_of_replicas"]) x+  toJSON (AutoExpandReplicas x) = oPath ("index" :| ["auto_expand_replicas"]) x+  toJSON (RefreshInterval x) = oPath ("index" :| ["refresh_interval"]) (NominalDiffTimeJSON x)+  toJSON (IndexConcurrency x) = oPath ("index" :| ["concurrency"]) x+  toJSON (FailOnMergeFailure x) = oPath ("index" :| ["fail_on_merge_failure"]) x+  toJSON (TranslogFlushThresholdOps x) = oPath ("index" :| ["translog", "flush_threshold_ops"]) x+  toJSON (TranslogFlushThresholdSize x) = oPath ("index" :| ["translog", "flush_threshold_size"]) x+  toJSON (TranslogFlushThresholdPeriod x) = oPath ("index" :| ["translog", "flush_threshold_period"]) (NominalDiffTimeJSON x)+  toJSON (TranslogDisableFlush x) = oPath ("index" :| ["translog", "disable_flush"]) x+  toJSON (CacheFilterMaxSize x) = oPath ("index" :| ["cache", "filter", "max_size"]) x+  toJSON (CacheFilterExpire x) = oPath ("index" :| ["cache", "filter", "expire"]) (NominalDiffTimeJSON <$> x)+  toJSON (GatewaySnapshotInterval x) = oPath ("index" :| ["gateway", "snapshot_interval"]) (NominalDiffTimeJSON x)+  toJSON (RoutingAllocationInclude fs) = oPath ("index" :| ["routing", "allocation", "include"]) (attrFilterJSON fs)+  toJSON (RoutingAllocationExclude fs) = oPath ("index" :| ["routing", "allocation", "exclude"]) (attrFilterJSON fs)+  toJSON (RoutingAllocationRequire fs) = oPath ("index" :| ["routing", "allocation", "require"]) (attrFilterJSON fs)+  toJSON (RoutingAllocationEnable x) = oPath ("index" :| ["routing", "allocation", "enable"]) x+  toJSON (RoutingAllocationShardsPerNode x) = oPath ("index" :| ["routing", "allocation", "total_shards_per_node"]) x+  toJSON (RecoveryInitialShards x) = oPath ("index" :| ["recovery", "initial_shards"]) x+  toJSON (GCDeletes x) = oPath ("index" :| ["gc_deletes"]) (NominalDiffTimeJSON x)+  toJSON (TTLDisablePurge x) = oPath ("index" :| ["ttl", "disable_purge"]) x+  toJSON (TranslogFSType x) = oPath ("index" :| ["translog", "fs", "type"]) x+  toJSON (IndexCompoundFormat x) = oPath ("index" :| ["compound_format"]) x+  toJSON (IndexCompoundOnFlush x) = oPath ("index" :| ["compound_on_flush"]) x+  toJSON (WarmerEnabled x) = oPath ("index" :| ["warmer", "enabled"]) x+  toJSON (BlocksReadOnly x) = oPath ("blocks" :| ["read_only"]) x+  toJSON (BlocksRead x) = oPath ("blocks" :| ["read"]) x+  toJSON (BlocksWrite x) = oPath ("blocks" :| ["write"]) x+  toJSON (BlocksMetaData x) = oPath ("blocks" :| ["metadata"]) x++instance FromJSON UpdatableIndexSetting where+  parseJSON = withObject "UpdatableIndexSetting" parse+    where parse o = numberOfReplicas `taggedAt` ["index", "number_of_replicas"]+                <|> autoExpandReplicas `taggedAt` ["index", "auto_expand_replicas"]+                <|> refreshInterval `taggedAt` ["index", "refresh_interval"]+                <|> indexConcurrency `taggedAt` ["index", "concurrency"]+                <|> failOnMergeFailure `taggedAt` ["index", "fail_on_merge_failure"]+                <|> translogFlushThresholdOps `taggedAt` ["index", "translog", "flush_threshold_ops"]+                <|> translogFlushThresholdSize `taggedAt` ["index", "translog", "flush_threshold_size"]+                <|> translogFlushThresholdPeriod `taggedAt` ["index", "translog", "flush_threshold_period"]+                <|> translogDisableFlush `taggedAt` ["index", "translog", "disable_flush"]+                <|> cacheFilterMaxSize `taggedAt` ["index", "cache", "filter", "max_size"]+                <|> cacheFilterExpire `taggedAt` ["index", "cache", "filter", "expire"]+                <|> gatewaySnapshotInterval `taggedAt` ["index", "gateway", "snapshot_interval"]+                <|> routingAllocationInclude `taggedAt` ["index", "routing", "allocation", "include"]+                <|> routingAllocationExclude `taggedAt` ["index", "routing", "allocation", "exclude"]+                <|> routingAllocationRequire `taggedAt` ["index", "routing", "allocation", "require"]+                <|> routingAllocationEnable `taggedAt` ["index", "routing", "allocation", "enable"]+                <|> routingAllocationShardsPerNode `taggedAt` ["index", "routing", "allocation", "total_shards_per_node"]+                <|> recoveryInitialShards `taggedAt` ["index", "recovery", "initial_shards"]+                <|> gcDeletes `taggedAt` ["index", "gc_deletes"]+                <|> ttlDisablePurge `taggedAt` ["index", "ttl", "disable_purge"]+                <|> translogFSType `taggedAt` ["index", "translog", "fs", "type"]+                <|> compoundFormat `taggedAt` ["index", "compound_format"]+                <|> compoundOnFlush `taggedAt` ["index", "compound_on_flush"]+                <|> warmerEnabled `taggedAt` ["index", "warmer", "enabled"]+                <|> blocksReadOnly `taggedAt` ["blocks", "read_only"]+                <|> blocksRead `taggedAt` ["blocks", "read"]+                <|> blocksWrite `taggedAt` ["blocks", "write"]+                <|> blocksMetaData `taggedAt` ["blocks", "metadata"]+            where taggedAt f ks = taggedAt' f (Object o) ks+          taggedAt' f v [] = f =<< (parseJSON v <|> (parseJSON =<< unStringlyTypeJSON v))+          taggedAt' f v (k:ks) = withObject "Object" (\o -> do v' <- o .: k+                                                               taggedAt' f v' ks) v+          numberOfReplicas               = pure . NumberOfReplicas+          autoExpandReplicas             = pure . AutoExpandReplicas+          refreshInterval                = pure . RefreshInterval . ndtJSON+          indexConcurrency               = pure . IndexConcurrency+          failOnMergeFailure             = pure . FailOnMergeFailure+          translogFlushThresholdOps      = pure . TranslogFlushThresholdOps+          translogFlushThresholdSize     = pure . TranslogFlushThresholdSize+          translogFlushThresholdPeriod   = pure . TranslogFlushThresholdPeriod . ndtJSON+          translogDisableFlush           = pure . TranslogDisableFlush+          cacheFilterMaxSize             = pure . CacheFilterMaxSize+          cacheFilterExpire              = pure . CacheFilterExpire . fmap ndtJSON+          gatewaySnapshotInterval        = pure . GatewaySnapshotInterval . ndtJSON+          routingAllocationInclude       = fmap RoutingAllocationInclude . parseAttrFilter+          routingAllocationExclude       = fmap RoutingAllocationExclude . parseAttrFilter+          routingAllocationRequire       = fmap RoutingAllocationRequire . parseAttrFilter+          routingAllocationEnable        = pure . RoutingAllocationEnable+          routingAllocationShardsPerNode = pure . RoutingAllocationShardsPerNode+          recoveryInitialShards          = pure . RecoveryInitialShards+          gcDeletes                      = pure . GCDeletes . ndtJSON+          ttlDisablePurge                = pure . TTLDisablePurge+          translogFSType                 = pure . TranslogFSType+          compoundFormat                 = pure . IndexCompoundFormat+          compoundOnFlush                = pure . IndexCompoundOnFlush+          warmerEnabled                  = pure . WarmerEnabled+          blocksReadOnly                 = pure . BlocksReadOnly+          blocksRead                     = pure . BlocksRead+          blocksWrite                    = pure . BlocksWrite+          blocksMetaData                 = pure . BlocksMetaData++instance FromJSON IndexSettingsSummary where+  parseJSON = withObject "IndexSettingsSummary" parse+    where parse o = case HM.toList o of+                      [(ixn, v@(Object o'))] -> IndexSettingsSummary (IndexName ixn)+                                                <$> parseJSON v+                                                <*> (fmap (filter (not . redundant)) . parseSettings =<< o' .: "settings")+                      _ -> fail "Expected single-key object with index name"+          redundant (NumberOfReplicas _) = True+          redundant _ = False++-- | For some reason in the settings API, all leaf values get returned+-- as strings. This function attepmts to recover from this for all+-- non-recursive JSON types. If nothing can be done or the same value+-- would be return, it returns 'mzero'+unStringlyTypeJSON :: MonadPlus m => Value -> m Value+unStringlyTypeJSON (String "true") = return (Bool True)+unStringlyTypeJSON (String "false") = return (Bool False)+unStringlyTypeJSON (String "null") = return Null+unStringlyTypeJSON (String t) = case readMay (T.unpack t) of+                                  Just n -> return (Number n)+                                  Nothing -> mzero+unStringlyTypeJSON _ = mzero+++parseSettings :: Object -> Parser [UpdatableIndexSetting]+parseSettings o = do+  o' <- o .: "index"+  -- slice the index object into singleton hashmaps and try to parse each+  parses <- forM (HM.toList o') $ \(k, v) -> do+    -- blocks are now nested into the "index" key, which is not how they're serialized+    let atRoot = Object (HM.singleton k v)+    let atIndex = Object (HM.singleton "index" atRoot)+    optional (parseJSON atRoot <|> parseJSON atIndex)+  return (catMaybes parses)++oPath :: ToJSON a => NonEmpty Text -> a -> Value+oPath (k :| []) v = object [k .= v]+oPath (k:| (h:t)) v = object [k .= oPath (h :| t) v]++attrFilterJSON :: NonEmpty NodeAttrFilter -> Value+attrFilterJSON fs = object [ n .= T.intercalate "," (toList vs)+                           | NodeAttrFilter (NodeAttrName n) vs <- toList fs]++parseAttrFilter :: Value -> Parser (NonEmpty NodeAttrFilter)+parseAttrFilter = withObject "NonEmpty NodeAttrFilter" parse+  where parse o = case HM.toList o of+                    [] -> fail "Expected non-empty list of NodeAttrFilters"+                    x:xs -> DT.mapM (uncurry parse') (x :| xs)+        parse' n = withText "Text" $ \t ->+          case T.splitOn "," t of+            fv:fvs -> return (NodeAttrFilter (NodeAttrName n) (fv :| fvs))+            [] -> fail "Expected non-empty list of filter values"++instance ToJSON ReplicaBounds where+  toJSON (ReplicasBounded a b)    = String (showText a <> "-" <> showText b)+  toJSON (ReplicasLowerBounded a) = String (showText a <> "-all")+  toJSON ReplicasUnbounded        = Bool False++instance FromJSON ReplicaBounds where+  parseJSON v = withText "ReplicaBounds" parseText v+            <|> withBool "ReplicaBounds" parseBool v+    where parseText t = case T.splitOn "-" t of+                          [a, "all"] -> ReplicasLowerBounded <$> parseReadText a+                          [a, b] -> ReplicasBounded <$> parseReadText a+                                                    <*> parseReadText b+                          _ -> fail ("Could not parse ReplicaBounds: " <> show t)+          parseBool False = pure ReplicasUnbounded+          parseBool _ = fail "ReplicasUnbounded cannot be represented with True"++instance ToJSON AllocationPolicy where+  toJSON AllocAll          = String "all"+  toJSON AllocPrimaries    = String "primaries"+  toJSON AllocNewPrimaries = String "new_primaries"+  toJSON AllocNone         = String "none"++instance FromJSON AllocationPolicy where+  parseJSON = withText "AllocationPolicy" parse+    where parse "all" = pure AllocAll+          parse "primaries" = pure AllocPrimaries+          parse "new_primaries" = pure AllocNewPrimaries+          parse "none" = pure AllocNone+          parse t = fail ("Invlaid AllocationPolicy: " <> show t)++instance ToJSON InitialShardCount where+  toJSON QuorumShards       = String "quorum"+  toJSON QuorumMinus1Shards = String "quorum-1"+  toJSON FullShards         = String "full"+  toJSON FullMinus1Shards   = String "full-1"+  toJSON (ExplicitShards x) = toJSON x++instance FromJSON InitialShardCount where+  parseJSON v = withText "InitialShardCount" parseText v+            <|> ExplicitShards <$> parseJSON v+    where parseText "quorum"   = pure QuorumShards+          parseText "quorum-1" = pure QuorumMinus1Shards+          parseText "full"     = pure FullShards+          parseText "full-1"   = pure FullMinus1Shards+          parseText _          = mzero++instance ToJSON FSType where+  toJSON FSSimple   = "simple"+  toJSON FSBuffered = "buffered"++instance FromJSON FSType where+  parseJSON = withText "FSType" parse+    where parse "simple" = pure FSSimple+          parse "buffered" = pure FSBuffered+          parse t = fail ("Invalid FSType: " <> show t)++instance ToJSON CompoundFormat where+  toJSON (CompoundFileFormat x) = Bool x+  toJSON (MergeSegmentVsTotalIndex x) = toJSON x++instance FromJSON CompoundFormat where+  parseJSON v = CompoundFileFormat <$> parseJSON v+            <|> MergeSegmentVsTotalIndex <$> parseJSON v++instance ToJSON NominalDiffTimeJSON where+  toJSON (NominalDiffTimeJSON t) = String (showText (round t :: Integer) <> "s")++instance FromJSON NominalDiffTimeJSON where+  parseJSON = withText "NominalDiffTime" parse+    where parse t = case T.takeEnd 1 t of+                      "s" -> NominalDiffTimeJSON . fromInteger <$> parseReadText (T.dropEnd 1 t)+                      _ -> fail "Invalid or missing NominalDiffTime unit (expected s)"++instance ToJSON IndexTemplate where+  toJSON (IndexTemplate p s m) = merge+    (object [ "template" .= p+            , "mappings" .= foldl' merge (object []) m+            ])+    (toJSON s)+   where+     merge (Object o1) (Object o2) = toJSON $ HM.union o1 o2+     merge o           Null        = o+     merge _           _           = undefined++instance (FromJSON a) => FromJSON (EsResult a) where+  parseJSON jsonVal@(Object v) = do+    found <- v .:? "found" .!= False+    fr <- if found+             then parseJSON jsonVal+             else return Nothing+    EsResult <$> v .:  "_index"   <*>+                 v .:  "_type"    <*>+                 v .:  "_id"      <*>+                 pure fr+  parseJSON _          = empty++instance (FromJSON a) => FromJSON (EsResultFound a) where+  parseJSON (Object v) = EsResultFound <$>+                         v .: "_version" <*>+                         v .: "_source"+  parseJSON _          = empty++instance FromJSON EsError where+  parseJSON (Object v) = EsError <$>+                         v .: "status" <*>+                         v .: "error"+  parseJSON _ = empty++instance FromJSON IndexAliasesSummary where+  parseJSON = withObject "IndexAliasesSummary" parse+    where parse o = IndexAliasesSummary . mconcat <$> mapM (uncurry go) (HM.toList o)+          go ixn = withObject "index aliases" $ \ia -> do+                     aliases <- ia .:? "aliases" .!= mempty+                     forM (HM.toList aliases) $ \(aName, v) -> do+                       let indexAlias = IndexAlias (IndexName ixn) (IndexAliasName (IndexName aName))+                       IndexAliasSummary indexAlias <$> parseJSON v+++instance ToJSON IndexAliasAction where+  toJSON (AddAlias ia opts) = object ["add" .= (iaObj <> optsObj)]+    where Object iaObj = toJSON ia+          Object optsObj = toJSON opts+  toJSON (RemoveAlias ia) = object ["remove" .= iaObj]+    where Object iaObj = toJSON ia++instance ToJSON IndexAlias where+  toJSON IndexAlias {..} = object ["index" .= srcIndex+                                  , "alias" .= indexAlias+                                  ]++instance ToJSON IndexAliasCreate where+  toJSON IndexAliasCreate {..} = Object (filterObj <> routingObj)+    where filterObj = maybe mempty (HM.singleton "filter" . toJSON) aliasCreateFilter+          Object routingObj = maybe (Object mempty) toJSON aliasCreateRouting++instance ToJSON AliasRouting where+  toJSON (AllAliasRouting v) = object ["routing" .= v]+  toJSON (GranularAliasRouting srch idx) = object (catMaybes prs)+    where prs = [("search_routing" .=) <$> srch+                ,("index_routing" .=) <$> idx]++instance FromJSON AliasRouting where+  parseJSON = withObject "AliasRouting" parse+    where parse o = parseAll o <|> parseGranular o+          parseAll o = AllAliasRouting <$> o .: "routing"+          parseGranular o = do+            sr <- o .:? "search_routing"+            ir <- o .:? "index_routing"+            if isNothing sr && isNothing ir+               then fail "Both search_routing and index_routing can't be blank"+               else return (GranularAliasRouting sr ir)++instance FromJSON IndexAliasCreate where+  parseJSON v = withObject "IndexAliasCreate" parse v+    where parse o = IndexAliasCreate <$> optional (parseJSON v)+                                     <*> o .:? "filter"++instance ToJSON SearchAliasRouting where+  toJSON (SearchAliasRouting rvs) = toJSON (T.intercalate "," (routingValue <$> toList rvs))++instance FromJSON SearchAliasRouting where+  parseJSON = withText "SearchAliasRouting" parse+    where parse t = SearchAliasRouting <$> parseNEJSON (String <$> T.splitOn "," t)++instance ToJSON Search where+  toJSON (Search query sFilter sort searchAggs highlight sTrackSortScores sFrom sSize _ sFields sSource) =+    omitNulls [ "query"        .= query+              , "filter"       .= sFilter+              , "sort"         .= sort+              , "aggregations" .= searchAggs+              , "highlight"    .= highlight+              , "from"         .= sFrom+              , "size"         .= sSize+              , "track_scores" .= sTrackSortScores+              , "fields"       .= sFields+              , "_source"      .= sSource]+++instance ToJSON Source where+    toJSON NoSource                         = toJSON False+    toJSON (SourcePatterns patterns)        = toJSON patterns+    toJSON (SourceIncludeExclude incl excl) = object [ "include" .= incl, "exclude" .= excl ]++instance ToJSON PatternOrPatterns where+  toJSON (PopPattern pattern)   = toJSON pattern+  toJSON (PopPatterns patterns) = toJSON patterns++instance ToJSON Include where+  toJSON (Include patterns) = toJSON patterns++instance ToJSON Exclude where+  toJSON (Exclude patterns) = toJSON patterns++instance ToJSON Pattern where+  toJSON (Pattern pattern) = toJSON pattern+++instance ToJSON FieldHighlight where+    toJSON (FieldHighlight (FieldName fName) (Just fSettings)) =+        object [ fName .= fSettings ]+    toJSON (FieldHighlight (FieldName fName) Nothing) =+        object [ fName .= emptyObject ]++instance ToJSON Highlights where+    toJSON (Highlights global fields) =+        omitNulls (("fields" .= fields)+                  : highlightSettingsPairs global)++instance ToJSON HighlightSettings where+    toJSON hs = omitNulls (highlightSettingsPairs (Just hs))++highlightSettingsPairs :: Maybe HighlightSettings -> [Pair]+highlightSettingsPairs Nothing = []+highlightSettingsPairs (Just (Plain plh)) = plainHighPairs (Just plh)+highlightSettingsPairs (Just (Postings ph)) = postHighPairs (Just ph)+highlightSettingsPairs (Just (FastVector fvh)) = fastVectorHighPairs (Just fvh)+++plainHighPairs :: Maybe PlainHighlight -> [Pair]+plainHighPairs Nothing = []+plainHighPairs (Just (PlainHighlight plCom plNonPost)) =+    [ "type" .= String "plain"]+    ++ commonHighlightPairs plCom+    ++ nonPostingsToPairs plNonPost++postHighPairs :: Maybe PostingsHighlight -> [Pair]+postHighPairs Nothing = []+postHighPairs (Just (PostingsHighlight pCom)) =+    ("type" .= String "postings")+    : commonHighlightPairs pCom++fastVectorHighPairs :: Maybe FastVectorHighlight -> [Pair]+fastVectorHighPairs Nothing = []+fastVectorHighPairs (Just+                     (FastVectorHighlight fvCom fvNonPostSettings fvBoundChars+                                          fvBoundMaxScan fvFragOff fvMatchedFields+                                          fvPhraseLim)) =+                        [ "type" .= String "fvh"+                        , "boundary_chars" .= fvBoundChars+                        , "boundary_max_scan" .= fvBoundMaxScan+                        , "fragment_offset" .= fvFragOff+                        , "matched_fields" .= fvMatchedFields+                        , "phraseLimit" .= fvPhraseLim]+                        ++ commonHighlightPairs fvCom+                        ++ nonPostingsToPairs fvNonPostSettings++deleteSeveral :: (Eq k, Hashable k) => [k] -> HM.HashMap k v -> HM.HashMap k v+deleteSeveral ks hm = foldr HM.delete hm ks++commonHighlightPairs :: Maybe CommonHighlight -> [Pair]+commonHighlightPairs Nothing = []+commonHighlightPairs (Just (CommonHighlight chScore chForceSource chTag chEncoder+                                      chNoMatchSize chHighlightQuery+                                      chRequireFieldMatch)) =+    [ "order" .= chScore+    , "force_source" .= chForceSource+    , "encoder" .= chEncoder+    , "no_match_size" .= chNoMatchSize+    , "highlight_query" .= chHighlightQuery+    , "require_fieldMatch" .= chRequireFieldMatch]+    ++ highlightTagToPairs chTag+++nonPostingsToPairs :: Maybe NonPostings -> [Pair]+nonPostingsToPairs Nothing = []+nonPostingsToPairs (Just (NonPostings npFragSize npNumOfFrags)) =+    [ "fragment_size" .= npFragSize+    , "number_of_fragments" .= npNumOfFrags]++parseNEJSON :: (FromJSON a) => [Value] -> Parser (NonEmpty a)+parseNEJSON []     = fail "Expected non-empty list"+parseNEJSON (x:xs) = DT.mapM parseJSON (x :| xs)+++instance ToJSON HighlightEncoder where+    toJSON DefaultEncoder = String "default"+    toJSON HTMLEncoder    = String "html"++highlightTagToPairs :: Maybe HighlightTag -> [Pair]+highlightTagToPairs (Just (TagSchema _))            = [ "scheme"    .=  String "default"]+highlightTagToPairs (Just (CustomTags (pre, post))) = [ "pre_tags"  .= pre+                                                      , "post_tags" .= post]+highlightTagToPairs Nothing = []++instance ToJSON SortSpec where+  toJSON (DefaultSortSpec+          (DefaultSort (FieldName dsSortFieldName) dsSortOrder dsIgnoreUnmapped+           dsSortMode dsMissingSort dsNestedFilter)) =+    object [dsSortFieldName .= omitNulls base] where+      base = [ "order" .= dsSortOrder+             , "ignore_unmapped" .= dsIgnoreUnmapped+             , "mode" .= dsSortMode+             , "missing" .= dsMissingSort+             , "nested_filter" .= dsNestedFilter ]++  toJSON (GeoDistanceSortSpec gdsSortOrder (GeoPoint (FieldName field) gdsLatLon) units) =+    object [ "unit" .= units+           , field .= gdsLatLon+           , "order" .= gdsSortOrder ]+++instance ToJSON SortOrder where+  toJSON Ascending  = String "asc"+  toJSON Descending = String "desc"+++instance ToJSON SortMode where+  toJSON SortMin = String "min"+  toJSON SortMax = String "max"+  toJSON SortSum = String "sum"+  toJSON SortAvg = String "avg"+++instance ToJSON Missing where+  toJSON LastMissing = String "_last"+  toJSON FirstMissing = String "_first"+  toJSON (CustomMissing txt) = String txt+++instance ToJSON ScoreType where+  toJSON ScoreTypeMax  = "max"+  toJSON ScoreTypeAvg  = "avg"+  toJSON ScoreTypeSum  = "sum"+  toJSON ScoreTypeNone = "none"++instance FromJSON ScoreType where+  parseJSON = withText "ScoreType" parse+    where parse "max"  = pure ScoreTypeMax+          parse "avg"  = pure ScoreTypeAvg+          parse "sum"  = pure ScoreTypeSum+          parse "none" = pure ScoreTypeNone+          parse t = fail ("Unexpected ScoreType: " <> show t)++instance ToJSON Distance where+  toJSON (Distance dCoefficient dUnit) =+    String boltedTogether where+      coefText = showText dCoefficient+      (String unitText) = toJSON dUnit+      boltedTogether = mappend coefText unitText++instance FromJSON Distance where+  parseJSON = withText "Distance" parse+    where parse t = Distance <$> parseCoeff nT+                             <*> parseJSON (String unitT)+            where (nT, unitT) = T.span validForNumber t+                  -- may be a better way to do this+                  validForNumber '-' = True+                  validForNumber '.' = True+                  validForNumber 'e' = True+                  validForNumber c = isNumber c+                  parseCoeff "" = fail "Empty string cannot be parsed as number"+                  parseCoeff s = return (read (T.unpack s))++instance ToJSON DistanceUnit where+  toJSON Miles         = String "mi"+  toJSON Yards         = String "yd"+  toJSON Feet          = String "ft"+  toJSON Inches        = String "in"+  toJSON Kilometers    = String "km"+  toJSON Meters        = String "m"+  toJSON Centimeters   = String "cm"+  toJSON Millimeters   = String "mm"+  toJSON NauticalMiles = String "nmi"+++instance FromJSON DistanceUnit where+  parseJSON = withText "DistanceUnit" parse+    where parse "mi"  = pure Miles+          parse "yd"  = pure Yards+          parse "ft"  = pure Feet+          parse "in"  = pure Inches+          parse "km"  = pure Kilometers+          parse "m"   = pure Meters+          parse "cm"  = pure Centimeters+          parse "mm"  = pure Millimeters+          parse "nmi" = pure NauticalMiles+          parse u = fail ("Unrecognized DistanceUnit: " <> show u)++instance ToJSON DistanceType where+  toJSON Arc       = String "arc"+  toJSON SloppyArc = String "sloppy_arc"+  toJSON Plane     = String "plane"++instance FromJSON DistanceType where+  parseJSON = withText "DistanceType" parse+    where parse "arc" = pure Arc+          parse "sloppy_arc" = pure SloppyArc+          parse "plane" = pure Plane+          parse t = fail ("Unrecognized DistanceType: " <> show t)+++instance ToJSON OptimizeBbox where+  toJSON NoOptimizeBbox = String "none"+  toJSON (OptimizeGeoFilterType gft) = toJSON gft++instance FromJSON OptimizeBbox where+  parseJSON v = withText "NoOptimizeBbox" parseNoOptimize v+            <|> parseOptimize v+    where parseNoOptimize "none" = pure NoOptimizeBbox+          parseNoOptimize _ = mzero+          parseOptimize = fmap OptimizeGeoFilterType . parseJSON++instance ToJSON GeoBoundingBoxConstraint where+  toJSON (GeoBoundingBoxConstraint+          (FieldName gbbcGeoBBField) gbbcConstraintBox cache type') =+    object [gbbcGeoBBField .= gbbcConstraintBox+           , "_cache"  .= cache+           , "type" .= type']++instance FromJSON GeoBoundingBoxConstraint where+  parseJSON = withObject "GeoBoundingBoxConstraint" parse+    where parse o = case HM.toList (deleteSeveral ["type", "_cache"] o) of+                      [(fn, v)] -> GeoBoundingBoxConstraint (FieldName fn)+                                   <$> parseJSON v+                                   <*> o .:? "_cache" .!= defaultCache+                                   <*> o .: "type"+                      _ -> fail "Could not find field name for GeoBoundingBoxConstraint"++instance ToJSON GeoFilterType where+  toJSON GeoFilterMemory  = String "memory"+  toJSON GeoFilterIndexed = String "indexed"++instance FromJSON GeoFilterType where+  parseJSON = withText "GeoFilterType" parse+    where parse "memory"  = pure GeoFilterMemory+          parse "indexed" = pure GeoFilterIndexed+          parse t         = fail ("Unrecognized GeoFilterType: " <> show t)++instance ToJSON GeoBoundingBox where+  toJSON (GeoBoundingBox gbbTopLeft gbbBottomRight) =+    object ["top_left"      .= gbbTopLeft+           , "bottom_right" .= gbbBottomRight]++instance FromJSON GeoBoundingBox where+  parseJSON = withObject "GeoBoundingBox" parse+    where parse o = GeoBoundingBox+                    <$> o .: "top_left"+                    <*> o .: "bottom_right"++instance ToJSON LatLon where+  toJSON (LatLon lLat lLon) =+    object ["lat"  .= lLat+           , "lon" .= lLon]++instance FromJSON LatLon where+  parseJSON = withObject "LatLon" parse+    where parse o = LatLon <$> o .: "lat"+                           <*> o .: "lon"++-- index for smaller ranges, fielddata for longer ranges+instance ToJSON RangeExecution where+  toJSON RangeExecutionIndex     = "index"+  toJSON RangeExecutionFielddata = "fielddata"+++instance FromJSON RangeExecution where+  parseJSON = withText "RangeExecution" parse+    where parse "index"     = pure RangeExecutionIndex+          parse "fielddata" = pure RangeExecutionFielddata+          parse t           = error ("Unrecognized RangeExecution " <> show t)++instance ToJSON RegexpFlags where+  toJSON AllRegexpFlags              = String "ALL"+  toJSON NoRegexpFlags               = String "NONE"+  toJSON (SomeRegexpFlags (h :| fs)) = String $ T.intercalate "|" flagStrs+    where flagStrs             = map flagStr . nub $ h:fs+          flagStr AnyString    = "ANYSTRING"+          flagStr Automaton    = "AUTOMATON"+          flagStr Complement   = "COMPLEMENT"+          flagStr Empty        = "EMPTY"+          flagStr Intersection = "INTERSECTION"+          flagStr Interval     = "INTERVAL"++instance FromJSON RegexpFlags where+  parseJSON = withText "RegexpFlags" parse+    where parse "ALL" = pure AllRegexpFlags+          parse "NONE" = pure NoRegexpFlags+          parse t = SomeRegexpFlags <$> parseNEJSON (String <$> T.splitOn "|" t)++instance FromJSON RegexpFlag where+  parseJSON = withText "RegexpFlag" parse+    where parse "ANYSTRING"    = pure AnyString+          parse "AUTOMATON"    = pure Automaton+          parse "COMPLEMENT"   = pure Complement+          parse "EMPTY"        = pure Empty+          parse "INTERSECTION" = pure Intersection+          parse "INTERVAL"     = pure Interval+          parse f              = fail ("Unknown RegexpFlag: " <> show f)++instance ToJSON Term where+  toJSON (Term field value) = object ["term" .= object+                                      [field .= value]]++instance FromJSON Term where+  parseJSON = withObject "Term" parse+    where parse o = do termObj <- o .: "term"+                       case HM.toList termObj of+                         [(fn, v)] -> Term fn <$> parseJSON v+                         _ -> fail "Expected object with 1 field-named key"++instance ToJSON BoolMatch where+  toJSON (MustMatch    term  cache) = object ["must"     .= term,+                                              "_cache" .= cache]+  toJSON (MustNotMatch term  cache) = object ["must_not" .= term,+                                              "_cache" .= cache]+  toJSON (ShouldMatch  terms cache) = object ["should"   .= fmap toJSON terms,+                                              "_cache" .= cache]++instance FromJSON BoolMatch where+  parseJSON = withObject "BoolMatch" parse+    where parse o = mustMatch `taggedWith` "must"+                <|> mustNotMatch `taggedWith` "must_not"+                <|> shouldMatch `taggedWith` "should"+            where taggedWith parser k = parser =<< o .: k+                  mustMatch t = MustMatch t <$> o .:? "_cache" .!= defaultCache+                  mustNotMatch t = MustNotMatch t <$> o .:? "_cache" .!= defaultCache+                  shouldMatch t = ShouldMatch t <$> o .:? "_cache" .!= defaultCache++instance (FromJSON a) => FromJSON (SearchResult a) where+  parseJSON (Object v) = SearchResult <$>+                         v .:  "took"         <*>+                         v .:  "timed_out"    <*>+                         v .:  "_shards"      <*>+                         v .:  "hits"         <*>+                         v .:? "aggregations" <*>+                         v .:? "_scroll_id"+  parseJSON _          = empty++instance (FromJSON a) => FromJSON (SearchHits a) where+  parseJSON (Object v) = SearchHits <$>+                         v .: "total"     <*>+                         v .: "max_score" <*>+                         v .: "hits"+  parseJSON _          = empty++instance (FromJSON a) => FromJSON (Hit a) where+  parseJSON (Object v) = Hit <$>+                         v .:  "_index"   <*>+                         v .:  "_type"    <*>+                         v .:  "_id"      <*>+                         v .:  "_score"   <*>+                         v .:?  "_source" <*>+                         v .:? "highlight"+  parseJSON _          = empty++instance FromJSON ShardResult where+  parseJSON (Object v) = ShardResult       <$>+                         v .: "total"      <*>+                         v .: "successful" <*>+                         v .: "failed"+  parseJSON _          = empty+++instance FromJSON DocVersion where+  parseJSON v = do+    i <- parseJSON v+    maybe (fail "DocVersion out of range") return $ mkDocVersion i++-- 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)  instance Bounded DocVersion where   minBound = DocVersion 1
tests/tests.hs view
@@ -1,30 +1,41 @@-{-# LANGUAGE DeriveGeneric       #-}-{-# LANGUAGE OverloadedStrings   #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE DeriveGeneric              #-}+{-# LANGUAGE FlexibleContexts           #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings          #-}+{-# LANGUAGE ScopedTypeVariables        #-}+{-# LANGUAGE TemplateHaskell            #-}+{-# LANGUAGE TypeOperators              #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Main where  import           Control.Applicative+import           Control.Error import           Control.Exception import           Control.Monad import           Control.Monad.Reader import           Data.Aeson+import           Data.Aeson.Types                (parseEither)+import qualified Data.ByteString.Lazy.Char8      as BL8+import           Data.DeriveTH import qualified Data.HashMap.Strict             as HM import           Data.List                       (nub)+import qualified Data.List                       as L import           Data.List.NonEmpty              (NonEmpty (..)) import qualified Data.List.NonEmpty              as NE import qualified Data.Map.Strict                 as M-import qualified Data.Maybe                      as MY import           Data.Monoid+import           Data.Proxy import           Data.Text                       (Text) import qualified Data.Text                       as T-import           Data.Time.Calendar              (Day (..))-import           Data.Time.Clock                 (UTCTime (..),+import           Data.Time.Calendar              (Day (..), fromGregorian)+import           Data.Time.Clock                 (NominalDiffTime, UTCTime (..),                                                   secondsToDiffTime)+import           Data.Typeable import qualified Data.Vector                     as V import           Database.Bloodhound-import           GHC.Generics                    (Generic)-import           Network.HTTP.Client+import           GHC.Generics                    as G+import           Network.HTTP.Client             hiding (Proxy) import qualified Network.HTTP.Types.Status       as NHTS import           Prelude                         hiding (filter) import           Test.Hspec@@ -102,6 +113,16 @@ when' :: Monad m => m Bool -> m () -> m () when' b f = b >>= \x -> when x f +(==~) :: (ApproxEq a, Show a) => a -> a -> Property+a ==~ b = counterexample (show a ++ " !=~ " ++ show b) (a =~ b)++propJSON :: forall a. (Arbitrary a, ToJSON a, FromJSON a, Show a, ApproxEq a, Typeable a) => Proxy a -> Spec+propJSON _ = prop testName $ \(a :: a) ->+  let jsonStr = "via " <> BL8.unpack (encode a)+  in counterexample jsonStr (parseEither parseJSON (toJSON a) ==~ Right a)+  where testName = show ty <> " FromJSON/ToJSON roundtrips"+        ty = typeOf (undefined :: a)+ data Location = Location { lat :: Double                          , lon :: Double } deriving (Eq, Generic, Show) @@ -112,10 +133,14 @@                    , location :: Location }            deriving (Eq, Generic, Show) -instance ToJSON   Tweet-instance FromJSON Tweet-instance ToJSON   Location-instance FromJSON Location+instance ToJSON   Tweet where+  toJSON = genericToJSON defaultOptions+instance FromJSON Tweet where+  parseJSON = genericParseJSON defaultOptions+instance ToJSON   Location where+  toJSON = genericToJSON defaultOptions+instance FromJSON Location where+  parseJSON = genericParseJSON defaultOptions  data ParentMapping = ParentMapping deriving (Eq, Show) @@ -194,15 +219,15 @@   _ <- refreshIndex testIndex   return () -searchTweet :: Search -> BH IO (Either String Tweet)+searchTweet :: Search -> BH IO (Either EsError Tweet) searchTweet search = do   result <- searchTweets search-  let myTweet :: Either String Tweet+  let myTweet :: Either EsError Tweet       myTweet = grabFirst result   return myTweet -searchTweets :: Search -> BH IO (Either String (SearchResult Tweet))-searchTweets search = eitherDecode . responseBody <$> searchByIndex testIndex search+searchTweets :: Search -> BH IO (Either EsError (SearchResult Tweet))+searchTweets search = parseEsResponse =<< searchByIndex testIndex search  searchExpectNoResults :: Search -> BH IO () searchExpectNoResults search = do@@ -236,92 +261,486 @@       forM_ hints $ searchExpectAggs . search       forM_ hints (\x -> searchValidBucketAgg (search x) "users" toTerms) -searchTweetHighlight :: Search -> BH IO (Either String (Maybe HitHighlight))+searchTweetHighlight :: Search -> BH IO (Either EsError (Maybe HitHighlight)) searchTweetHighlight search = do   result <- searchTweets search   let myHighlight = fmap (hitHighlight . head . hits . searchHits) result   return myHighlight -searchExpectSource :: Source -> Either String Value -> BH IO ()+searchExpectSource :: Source -> Either EsError Value -> BH IO () searchExpectSource src expected = do   _ <- insertData   let query = QueryMatchQuery $ mkMatchQuery (FieldName "_all") (QueryString "haskell")   let search = (mkSearch (Just query) Nothing) { source = Just src }   reply <- searchAll search-  let result = eitherDecode (responseBody reply) :: Either String (SearchResult Value)+  result <- parseEsResponse reply--  :: Either EsError (SearchResult Value)   let value = grabFirst result   liftIO $     value `shouldBe` expected  data BulkTest = BulkTest { name :: Text } deriving (Eq, Generic, Show)-instance FromJSON BulkTest-instance ToJSON BulkTest+instance FromJSON BulkTest where+  parseJSON = genericParseJSON defaultOptions+instance ToJSON BulkTest where+  toJSON = genericToJSON defaultOptions -noDuplicates :: Eq a => [a] -> Bool-noDuplicates xs = nub xs == xs+class GApproxEq f where+  gApproxEq :: f a -> f a -> Bool -instance Arbitrary RegexpFlags where-  arbitrary = oneof [ pure AllRegexpFlags-                    , pure NoRegexpFlags-                    , SomeRegexpFlags <$> arbitrary-                    ]+-- | Unit type+instance GApproxEq U1 where+  gApproxEq U1 U1 = True -instance Arbitrary a => Arbitrary (NonEmpty a) where-  arbitrary = liftA2 (:|) arbitrary arbitrary+-- | Sum type, ensure same constructors, recurse+instance (GApproxEq a, GApproxEq b) => GApproxEq (a :+: b) where+  gApproxEq (L1 a) (L1 b) = gApproxEq a b+  gApproxEq (R1 a) (R1 b) = gApproxEq a b+  gApproxEq _ _           = False -instance Arbitrary RegexpFlag where-  arbitrary = oneof [ pure AnyString-                    , pure Automaton-                    , pure Complement-                    , pure Empty-                    , pure Intersection-                    , pure Interval-                    ]+-- | Product type, ensure each field is approx eq+instance (GApproxEq a, GApproxEq b) => GApproxEq (a :*: b) where+  gApproxEq (a1 :*: b1) (a2 :*: b2) = gApproxEq a1 a2 && gApproxEq b1 b2 -arbitraryScore :: Gen Score-arbitraryScore = fmap getPositive <$> arbitrary+-- | Value type, actually check the values for approx equality+instance (ApproxEq a) => GApproxEq (K1 i a) where+  gApproxEq (K1 a) (K1 b) = a =~ b +instance (GApproxEq f) => GApproxEq (M1 i t f) where+  gApproxEq (M1 a) (M1 b) = gApproxEq a b++-- | Typeclass for "equal where it matters". Use this to specify+-- less-strict equivalence for things such as lists that can wind up+-- in an unpredictable order+class ApproxEq a where+  (=~) :: a -> a -> Bool+  default (=~) :: (Generic a, GApproxEq (Rep a)) => a -> a -> Bool+  a =~ b = gApproxEq (G.from a) (G.from b)++instance ApproxEq NominalDiffTime where (=~) = (==)+instance ApproxEq UTCTime where (=~) = (==)+instance ApproxEq Text where (=~) = (==)+instance ApproxEq Bool where (=~) = (==)+instance ApproxEq Int where (=~) = (==)+instance ApproxEq Double where (=~) = (==)+instance ApproxEq a => ApproxEq (NonEmpty a)+instance ApproxEq a => ApproxEq (Maybe a)+instance ApproxEq GeoPoint+instance ApproxEq Regexp+instance ApproxEq RangeValue+instance ApproxEq LessThan+instance ApproxEq LessThanEq+instance ApproxEq LessThanD+instance ApproxEq LessThanEqD+instance ApproxEq GreaterThan+instance ApproxEq GreaterThanEq+instance ApproxEq GreaterThanD+instance ApproxEq GreaterThanEqD+instance ApproxEq MinimumMatchHighLow+instance ApproxEq RegexpFlag+instance ApproxEq RegexpFlags+instance ApproxEq NullValue+instance ApproxEq Version+instance ApproxEq DistanceRange+instance ApproxEq IndexName+instance ApproxEq MappingName+instance ApproxEq DocId+instance ApproxEq IndexAliasRouting+instance ApproxEq RoutingValue+instance ApproxEq ShardCount+instance ApproxEq ReplicaCount+instance ApproxEq TemplateName+instance ApproxEq TemplatePattern+instance ApproxEq QueryString+instance ApproxEq FieldName+instance ApproxEq CacheName+instance ApproxEq CacheKey+instance ApproxEq Existence+instance ApproxEq CutoffFrequency+instance ApproxEq Analyzer+instance ApproxEq Lenient+instance ApproxEq Tiebreaker+instance ApproxEq Boost+instance ApproxEq BoostTerms+instance ApproxEq MaxExpansions+instance ApproxEq MinimumMatch+instance ApproxEq DisableCoord+instance ApproxEq IgnoreTermFrequency+instance ApproxEq MinimumTermFrequency+instance ApproxEq MaxQueryTerms+instance ApproxEq Fuzziness+instance ApproxEq PrefixLength+instance ApproxEq TypeName+instance ApproxEq PercentMatch+instance ApproxEq StopWord+instance ApproxEq QueryPath+instance ApproxEq AllowLeadingWildcard+instance ApproxEq LowercaseExpanded+instance ApproxEq EnablePositionIncrements+instance ApproxEq AnalyzeWildcard+instance ApproxEq GeneratePhraseQueries+instance ApproxEq Locale+instance ApproxEq MaxWordLength+instance ApproxEq MinWordLength+instance ApproxEq PhraseSlop+instance ApproxEq MinDocFrequency+instance ApproxEq MaxDocFrequency+instance ApproxEq Filter+instance ApproxEq Query+instance ApproxEq SimpleQueryStringQuery+instance ApproxEq FieldOrFields+instance ApproxEq SimpleQueryFlag+instance ApproxEq RegexpQuery+instance ApproxEq QueryStringQuery+instance ApproxEq RangeQuery+instance ApproxEq PrefixQuery+instance ApproxEq NestedQuery+instance ApproxEq MoreLikeThisFieldQuery+instance ApproxEq MoreLikeThisQuery+instance ApproxEq IndicesQuery+instance ApproxEq HasParentQuery+instance ApproxEq HasChildQuery+instance ApproxEq FuzzyQuery+instance ApproxEq FuzzyLikeFieldQuery+instance ApproxEq FuzzyLikeThisQuery+instance ApproxEq FilteredQuery+instance ApproxEq DisMaxQuery+instance ApproxEq CommonTermsQuery+instance ApproxEq CommonMinimumMatch+instance ApproxEq BoostingQuery+instance ApproxEq BoolQuery+instance ApproxEq MatchQuery+instance ApproxEq MultiMatchQueryType+instance ApproxEq BooleanOperator+instance ApproxEq ZeroTermsQuery+instance ApproxEq MatchQueryType+instance ApproxEq AliasRouting+instance ApproxEq IndexAliasCreate+instance ApproxEq SearchAliasRouting+instance ApproxEq ScoreType+instance ApproxEq Distance+instance ApproxEq DistanceUnit+instance ApproxEq DistanceType+instance ApproxEq OptimizeBbox+instance ApproxEq GeoBoundingBoxConstraint+instance ApproxEq GeoFilterType+instance ApproxEq GeoBoundingBox+instance ApproxEq LatLon+instance ApproxEq RangeExecution+instance ApproxEq FSType+instance ApproxEq CompoundFormat+instance ApproxEq InitialShardCount+instance ApproxEq Bytes+instance ApproxEq ReplicaBounds+instance ApproxEq Term+instance ApproxEq BoolMatch+instance ApproxEq MultiMatchQuery+instance ApproxEq IndexSettings+instance ApproxEq AllocationPolicy+instance ApproxEq Char+instance ApproxEq a => ApproxEq [a] where+  as =~ bs = and (zipWith (=~) as bs)+instance (ApproxEq l, ApproxEq r) => ApproxEq (Either l r) where+  Left a =~ Left b = a =~ b+  Right a =~ Right b = a =~ b+  _ =~ _ = False+instance ApproxEq NodeAttrFilter+instance ApproxEq NodeAttrName++-- | Due to the way nodeattrfilters get serialized here, they may come+-- out in a different order, but they are morally equivalent+instance ApproxEq UpdatableIndexSetting where+  RoutingAllocationInclude a =~ RoutingAllocationInclude b =+    NE.sort a =~ NE.sort b+  RoutingAllocationExclude a =~ RoutingAllocationExclude b =+    NE.sort a =~ NE.sort b+  RoutingAllocationRequire a =~ RoutingAllocationRequire b =+    NE.sort a =~ NE.sort b+  a =~ b = a == b+++noDuplicates :: Eq a => [a] -> Bool+noDuplicates xs = nub xs == xs++instance Arbitrary NominalDiffTime where+  arbitrary = fromInteger <$> arbitrary++instance (Arbitrary k, Ord k, Arbitrary v) => Arbitrary (M.Map k v) where+  arbitrary = M.fromList <$> arbitrary+ instance Arbitrary Text where   arbitrary = T.pack <$> arbitrary -instance (Arbitrary k, Arbitrary v, Ord k) => Arbitrary (M.Map k v) where-  arbitrary = M.fromList <$> arbitrary+instance Arbitrary UTCTime where+  arbitrary = UTCTime+          <$> arbitrary+          <*> (fromRational . toRational <$> choose (0::Double, 86400)) -instance Arbitrary IndexName where-  arbitrary = IndexName <$> arbitrary+instance Arbitrary Day where+    arbitrary = ModifiedJulianDay <$> (2000 +) <$> arbitrary+    shrink    = (ModifiedJulianDay <$>) . shrink . toModifiedJulianDay -instance Arbitrary MappingName where-  arbitrary = MappingName <$> arbitrary+instance Arbitrary a => Arbitrary (NonEmpty a) where+  arbitrary = liftA2 (:|) arbitrary arbitrary -instance Arbitrary DocId where-  arbitrary = DocId <$> arbitrary+arbitraryScore :: Gen Score+arbitraryScore = fmap getPositive <$> arbitrary -instance Arbitrary a => Arbitrary (Hit a) where+instance (Arbitrary a, Typeable a) => Arbitrary (Hit a) where   arbitrary = Hit <$> arbitrary                   <*> arbitrary                   <*> arbitrary                   <*> arbitraryScore                   <*> arbitrary                   <*> arbitrary+  shrink = genericShrink  -instance Arbitrary a => Arbitrary (SearchHits a) where-  arbitrary = sized $ \n -> resize (n `div` 2) $ do+instance (Arbitrary a, Typeable a) => Arbitrary (SearchHits a) where+  arbitrary = reduceSize $ do     tot <- getPositive <$> arbitrary     score <- arbitraryScore     hs <- arbitrary     return $ SearchHits tot score hs+  shrink = genericShrink +reduceSize :: Gen a -> Gen a+reduceSize f = sized $ \n -> resize (n `div` 2) f+ getSource :: EsResult a -> Maybe a getSource = fmap _source . foundResult --- grabFirst :: Either String (SearchResult a) -> Either String a+grabFirst :: Either EsError (SearchResult a) -> Either EsError a grabFirst r =   case fmap (hitSource . head . hits . searchHits) r of     (Left e) -> Left e-    (Right Nothing) -> Left "Source was missing"+    (Right Nothing) -> Left (EsError 500 "Source was missing")     (Right (Just x)) -> Right x +-------------------------------------------------------------------------------+arbitraryAlphaNum :: Gen Char+arbitraryAlphaNum = oneof [choose ('a', 'z')+                          ,choose ('A','Z')+                          , choose ('0', '9')]++instance Arbitrary RoutingValue where+  arbitrary = RoutingValue . T.pack <$> listOf1 arbitraryAlphaNum++instance Arbitrary AliasRouting where+  arbitrary = oneof [allAlias+                    ,one+                    ,theOther+                    ,both]+    where one = GranularAliasRouting+                <$> (Just <$> arbitrary)+                <*> pure Nothing+          theOther = GranularAliasRouting Nothing+                     <$> (Just <$> arbitrary)+          both = GranularAliasRouting+                 <$> (Just <$> arbitrary)+                 <*> (Just <$> arbitrary)+          allAlias = AllAliasRouting <$> arbitrary+  shrink = genericShrink+++instance Arbitrary FieldName where+  arbitrary = FieldName . T.pack <$> listOf1 arbitraryAlphaNum+  shrink = genericShrink+++instance Arbitrary RegexpFlags where+  arbitrary = oneof [ pure AllRegexpFlags+                    , pure NoRegexpFlags+                    , SomeRegexpFlags <$> genUniqueFlags+                    ]+    where genUniqueFlags = NE.fromList . nub <$> listOf1 arbitrary+  shrink = genericShrink+++instance Arbitrary IndexAliasCreate where+  arbitrary = IndexAliasCreate <$> arbitrary <*> reduceSize arbitrary+  shrink = genericShrink++instance Arbitrary Query where+  arbitrary = reduceSize $ oneof [ TermQuery <$> arbitrary <*> arbitrary+                                 , TermsQuery <$> arbitrary <*> arbitrary+                                 , QueryMatchQuery <$> arbitrary+                                 , QueryMultiMatchQuery <$> arbitrary+                                 , QueryBoolQuery <$> arbitrary+                                 , QueryBoostingQuery <$> arbitrary+                                 , QueryCommonTermsQuery <$> arbitrary+                                 , ConstantScoreFilter <$> arbitrary <*> arbitrary+                                 , ConstantScoreQuery <$> arbitrary <*> arbitrary+                                 , QueryDisMaxQuery <$> arbitrary+                                 , QueryFilteredQuery <$> arbitrary+                                 , QueryFuzzyLikeThisQuery <$> arbitrary+                                 , QueryFuzzyLikeFieldQuery <$> arbitrary+                                 , QueryFuzzyQuery <$> arbitrary+                                 , QueryHasChildQuery <$> arbitrary+                                 , QueryHasParentQuery <$> arbitrary+                                 , IdsQuery <$> arbitrary <*> arbitrary+                                 , QueryIndicesQuery <$> arbitrary+                                 , MatchAllQuery <$> arbitrary+                                 , QueryMoreLikeThisQuery <$> arbitrary+                                 , QueryMoreLikeThisFieldQuery <$> arbitrary+                                 , QueryNestedQuery <$> arbitrary+                                 , QueryPrefixQuery <$> arbitrary+                                 , QueryQueryStringQuery <$> arbitrary+                                 , QuerySimpleQueryStringQuery <$> arbitrary+                                 , QueryRangeQuery <$> arbitrary+                                 , QueryRegexpQuery <$> arbitrary+                                 ]+  shrink = genericShrink++instance Arbitrary Filter where+  arbitrary = reduceSize $ oneof [ AndFilter <$> arbitrary <*> arbitrary+                                 , OrFilter <$> arbitrary <*> arbitrary+                                 , NotFilter <$> arbitrary <*> arbitrary+                                 , pure IdentityFilter+                                 , BoolFilter <$> arbitrary+                                 , ExistsFilter <$> arbitrary+                                 , GeoBoundingBoxFilter <$> arbitrary+                                 , GeoDistanceFilter <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+                                 , GeoDistanceRangeFilter <$> arbitrary <*> arbitrary+                                 , GeoPolygonFilter <$> arbitrary <*> arbitrary+                                 , IdsFilter <$> arbitrary <*> arbitrary+                                 , LimitFilter <$> arbitrary+                                 , MissingFilter <$> arbitrary <*> arbitrary <*> arbitrary+                                 , PrefixFilter <$> arbitrary <*> arbitrary <*> arbitrary+                                 , QueryFilter <$> arbitrary <*> arbitrary+                                 , RangeFilter <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+                                 , RegexpFilter <$> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary <*> arbitrary+                                 , TermFilter <$> arbitrary <*> arbitrary]+  shrink = genericShrink++instance Arbitrary ReplicaBounds where+  arbitrary = oneof [ replicasBounded+                    , replicasLowerBounded+                    , pure ReplicasUnbounded+                    ]+    where replicasBounded = do Positive a <- arbitrary+                               Positive b <- arbitrary+                               return (ReplicasBounded a b)+          replicasLowerBounded = do Positive a <- arbitrary+                                    return (ReplicasLowerBounded a)++instance Arbitrary NodeAttrName where+  arbitrary = NodeAttrName . T.pack . getNonEmpty <$> arbitrary+++instance Arbitrary NodeAttrFilter where+  arbitrary = do+    n <- arbitrary+    s:ss <- listOf1 (listOf1 arbitraryAlphaNum)+    let ts = T.pack <$> s :| ss+    return (NodeAttrFilter n ts)++$(derive makeArbitrary ''IndexName)+$(derive makeArbitrary ''MappingName)+$(derive makeArbitrary ''DocId)+$(derive makeArbitrary ''Version)+$(derive makeArbitrary ''IndexAliasRouting)+$(derive makeArbitrary ''ShardCount)+$(derive makeArbitrary ''ReplicaCount)+$(derive makeArbitrary ''TemplateName)+$(derive makeArbitrary ''TemplatePattern)+$(derive makeArbitrary ''QueryString)+$(derive makeArbitrary ''CacheName)+$(derive makeArbitrary ''CacheKey)+$(derive makeArbitrary ''Existence)+$(derive makeArbitrary ''CutoffFrequency)+$(derive makeArbitrary ''Analyzer)+$(derive makeArbitrary ''MaxExpansions)+$(derive makeArbitrary ''Lenient)+$(derive makeArbitrary ''Tiebreaker)+$(derive makeArbitrary ''Boost)+$(derive makeArbitrary ''BoostTerms)+$(derive makeArbitrary ''MinimumMatch)+$(derive makeArbitrary ''DisableCoord)+$(derive makeArbitrary ''IgnoreTermFrequency)+$(derive makeArbitrary ''MinimumTermFrequency)+$(derive makeArbitrary ''MaxQueryTerms)+$(derive makeArbitrary ''Fuzziness)+$(derive makeArbitrary ''PrefixLength)+$(derive makeArbitrary ''TypeName)+$(derive makeArbitrary ''PercentMatch)+$(derive makeArbitrary ''StopWord)+$(derive makeArbitrary ''QueryPath)+$(derive makeArbitrary ''AllowLeadingWildcard)+$(derive makeArbitrary ''LowercaseExpanded)+$(derive makeArbitrary ''EnablePositionIncrements)+$(derive makeArbitrary ''AnalyzeWildcard)+$(derive makeArbitrary ''GeneratePhraseQueries)+$(derive makeArbitrary ''Locale)+$(derive makeArbitrary ''MaxWordLength)+$(derive makeArbitrary ''MinWordLength)+$(derive makeArbitrary ''PhraseSlop)+$(derive makeArbitrary ''MinDocFrequency)+$(derive makeArbitrary ''MaxDocFrequency)+$(derive makeArbitrary ''Regexp)+$(derive makeArbitrary ''SimpleQueryStringQuery)+$(derive makeArbitrary ''FieldOrFields)+$(derive makeArbitrary ''SimpleQueryFlag)+$(derive makeArbitrary ''RegexpQuery)+$(derive makeArbitrary ''QueryStringQuery)+$(derive makeArbitrary ''RangeQuery)+$(derive makeArbitrary ''RangeValue)+$(derive makeArbitrary ''PrefixQuery)+$(derive makeArbitrary ''NestedQuery)+$(derive makeArbitrary ''MoreLikeThisFieldQuery)+$(derive makeArbitrary ''MoreLikeThisQuery)+$(derive makeArbitrary ''IndicesQuery)+$(derive makeArbitrary ''HasParentQuery)+$(derive makeArbitrary ''HasChildQuery)+$(derive makeArbitrary ''FuzzyQuery)+$(derive makeArbitrary ''FuzzyLikeFieldQuery)+$(derive makeArbitrary ''FuzzyLikeThisQuery)+$(derive makeArbitrary ''FilteredQuery)+$(derive makeArbitrary ''DisMaxQuery)+$(derive makeArbitrary ''CommonTermsQuery)+$(derive makeArbitrary ''DistanceRange)+$(derive makeArbitrary ''MultiMatchQuery)+$(derive makeArbitrary ''LessThanD)+$(derive makeArbitrary ''LessThanEqD)+$(derive makeArbitrary ''GreaterThanD)+$(derive makeArbitrary ''GreaterThanEqD)+$(derive makeArbitrary ''LessThan)+$(derive makeArbitrary ''LessThanEq)+$(derive makeArbitrary ''GreaterThan)+$(derive makeArbitrary ''GreaterThanEq)+$(derive makeArbitrary ''GeoPoint)+$(derive makeArbitrary ''NullValue)+$(derive makeArbitrary ''MinimumMatchHighLow)+$(derive makeArbitrary ''CommonMinimumMatch)+$(derive makeArbitrary ''BoostingQuery)+$(derive makeArbitrary ''BoolQuery)+$(derive makeArbitrary ''MatchQuery)+$(derive makeArbitrary ''MultiMatchQueryType)+$(derive makeArbitrary ''BooleanOperator)+$(derive makeArbitrary ''ZeroTermsQuery)+$(derive makeArbitrary ''MatchQueryType)+$(derive makeArbitrary ''SearchAliasRouting)+$(derive makeArbitrary ''ScoreType)+$(derive makeArbitrary ''Distance)+$(derive makeArbitrary ''DistanceUnit)+$(derive makeArbitrary ''DistanceType)+$(derive makeArbitrary ''OptimizeBbox)+$(derive makeArbitrary ''GeoBoundingBoxConstraint)+$(derive makeArbitrary ''GeoFilterType)+$(derive makeArbitrary ''GeoBoundingBox)+$(derive makeArbitrary ''LatLon)+$(derive makeArbitrary ''RangeExecution)+$(derive makeArbitrary ''RegexpFlag)+$(derive makeArbitrary ''BoolMatch)+$(derive makeArbitrary ''Term)+$(derive makeArbitrary ''IndexSettings)+$(derive makeArbitrary ''UpdatableIndexSetting)+$(derive makeArbitrary ''Bytes)+$(derive makeArbitrary ''AllocationPolicy)+$(derive makeArbitrary ''InitialShardCount)+$(derive makeArbitrary ''FSType)+$(derive makeArbitrary ''CompoundFormat)++ main :: IO () main = hspec $ do @@ -335,6 +754,11 @@         validateStatus resp 200         validateStatus deleteResp 200 +  describe "error parsing" $ do+    it "can parse EsErrors" $ withTestEnv $ do+      res <- getDocument (IndexName "bogus") (MappingName "also_bogus") (DocId "bogus_as_well")+      let errorResp = eitherDecode (responseBody res)+      liftIO (errorResp `shouldBe` Right (EsError 404 "IndexMissingException[[bogus] missing]"))    describe "document API" $ do     it "indexes, gets, and then deletes the generated document" $ withTestEnv $ do@@ -427,9 +851,29 @@       liftIO $         myTweet `shouldBe` Right exampleTweet +    it "handles constant score queries" $ withTestEnv $ do+      _ <- insertData+      let query = TermsQuery "user" ("bitemyapp" :| [])+      let cfQuery = ConstantScoreQuery query (Boost 1.0)+      let filter = IdentityFilter+      let search = mkSearch (Just cfQuery) (Just filter)+      myTweet <- searchTweet search+      liftIO $+        myTweet `shouldBe` Right exampleTweet+    it "handles constant score filters" $ withTestEnv $ do+      _ <- insertData+      let query = TermsQuery "user" ("bitemyapp" :| [])+      let cfFilter = ConstantScoreFilter IdentityFilter (Boost 1.0)+      let boolQuery = mkBoolQuery [query, cfFilter] [] []+      let search = mkSearch (Just (QueryBoolQuery boolQuery)) Nothing+      myTweet <- searchTweet search+      liftIO $+        myTweet `shouldBe` Right exampleTweet++     it "returns document for terms query and identity filter" $ withTestEnv $ do       _ <- insertData-      let query = TermsQuery (NE.fromList [(Term "user" "bitemyapp")])+      let query = TermsQuery "user" ("bitemyapp" :| [])       let filter = IdentityFilter <&&> IdentityFilter       let search = mkSearch (Just query) (Just filter)       myTweet <- searchTweet search@@ -713,6 +1157,43 @@         fmap aggregations res `shouldBe` Right (Just (M.fromList [ docCountPair "bitemyapps" 1                                                                  , docCountPair "notmyapps" 1                                                                  ]))+    it "can execute date_range aggregations" $ withTestEnv $ do+      let now = fromGregorian 2015 3 14+      let ltAMonthAgo = UTCTime (fromGregorian 2015 3 1) 0+      let ltAWeekAgo = UTCTime (fromGregorian 2015 3 10) 0+      let oldDoc = exampleTweet { postDate = ltAMonthAgo }+      let newDoc = exampleTweet { postDate = ltAWeekAgo }+      _ <- indexDocument testIndex testMapping defaultIndexDocumentSettings oldDoc (DocId "1")+      _ <- indexDocument testIndex testMapping defaultIndexDocumentSettings newDoc (DocId "2")+      _ <- refreshIndex testIndex+      let thisMonth = DateRangeFrom (DateMathExpr (DMDate now) [SubtractTime 1 DMMonth])+      let thisWeek = DateRangeFrom (DateMathExpr (DMDate now) [SubtractTime 1 DMWeek])+      let agg = DateRangeAggregation (FieldName "postDate") Nothing (thisMonth :| [thisWeek])+      let ags = mkAggregations "date_ranges" (DateRangeAgg agg)+      let search = mkAggregateSearch Nothing ags+      res <- searchTweets search+      liftIO $ hitsTotal . searchHits <$> res `shouldBe` Right 2+      let bucks = do magrs <- fmapL show (aggregations <$> res)+                     agrs <- note "no aggregations returned" magrs+                     rawBucks <- note "no date_ranges aggregation" $ M.lookup "date_ranges" agrs+                     parseEither parseJSON rawBucks+      let fromMonthT = UTCTime (fromGregorian 2015 2 14) 0+      let fromWeekT = UTCTime (fromGregorian 2015 3 7) 0+      liftIO $ buckets <$> bucks `shouldBe` Right [ DateRangeResult "2015-02-14T00:00:00.000Z-*"+                                                                    (Just fromMonthT)+                                                                    (Just "2015-02-14T00:00:00.000Z")+                                                                    Nothing+                                                                    Nothing+                                                                    2+                                                                    Nothing+                                                  , DateRangeResult "2015-03-07T00:00:00.000Z-*"+                                                                    (Just fromWeekT)+                                                                    (Just "2015-03-07T00:00:00.000Z")+                                                                    Nothing+                                                                    Nothing+                                                                    1+                                                                    Nothing+                                     ]      it "returns date histogram aggregation results" $ withTestEnv $ do       _ <- insertData@@ -762,7 +1243,7 @@     it "doesn't include source when sources are disabled" $ withTestEnv $ do       searchExpectSource         NoSource-        (Left "Source was missing")+        (Left (EsError 500 "Source was missing"))      it "includes a source" $ withTestEnv $ do       searchExpectSource@@ -859,3 +1340,160 @@         regular_search `shouldBe` Right exampleTweet -- Check that the size restrtiction is being honored       liftIO $         scan_search `shouldMatchList` [Just exampleTweet, Just otherTweet]++  describe "index aliases" $ do+    it "handles the simple case of aliasing an existing index" $ do+      let alias = IndexAlias (testIndex) (IndexAliasName (IndexName "bloodhound-tests-twitter-1-alias"))+      let create = IndexAliasCreate Nothing Nothing+      let action = AddAlias alias create++      withTestEnv $ do+        resetIndex+        resp <- updateIndexAliases (action :| [])+        liftIO $ validateStatus resp 200+      let cleanup = withTestEnv (updateIndexAliases (RemoveAlias alias :| []))+      (do aliases <- withTestEnv getIndexAliases+          let expected = IndexAliasSummary alias create+          case aliases of+            Right (IndexAliasesSummary summs) ->+              L.find ((== alias) . indexAliasSummaryAlias) summs `shouldBe` Just expected+            Left e -> expectationFailure ("Expected an IndexAliasesSummary but got " <> show e)) `finally` cleanup++    it "handles an alias with routing and a filter" $ do+      let alias = IndexAlias (testIndex) (IndexAliasName (IndexName "bloodhound-tests-twitter-1-alias"))+      let sar = SearchAliasRouting (RoutingValue "search val" :| [])+      let iar = IndexAliasRouting (RoutingValue "index val")+      let routing = GranularAliasRouting (Just sar) (Just iar)+      let filter = LimitFilter 42+      let create = IndexAliasCreate (Just routing) (Just filter)+      let action = AddAlias alias create++      withTestEnv $ do+        resetIndex+        resp <- updateIndexAliases (action :| [])+        liftIO $ validateStatus resp 200+      let cleanup = withTestEnv (updateIndexAliases (RemoveAlias alias :| []))+      (do aliases <- withTestEnv getIndexAliases+          let expected = IndexAliasSummary alias create+          case aliases of+            Right (IndexAliasesSummary summs) ->+              L.find ((== alias) . indexAliasSummaryAlias) summs `shouldBe` Just expected+            Left e -> expectationFailure ("Expected an IndexAliasesSummary but got " <> show e)) `finally` cleanup++  describe "Index Settings" $ do+    it "persists settings" $ withTestEnv $ do+      _ <- deleteExampleIndex+      _ <- createExampleIndex+      let updates = BlocksWrite False :| []+      updateResp <- updateIndexSettings updates testIndex+      liftIO $ validateStatus updateResp 200+      getResp <- getIndexSettings testIndex+      liftIO $+        getResp `shouldBe` Right (IndexSettingsSummary+                                    testIndex+                                    (IndexSettings (ShardCount 1) (ReplicaCount 0))+                                    (NE.toList updates))++  describe "JSON instances" $ do+    propJSON (Proxy :: Proxy Version)+    propJSON (Proxy :: Proxy IndexName)+    propJSON (Proxy :: Proxy MappingName)+    propJSON (Proxy :: Proxy DocId)+    propJSON (Proxy :: Proxy IndexAliasRouting)+    propJSON (Proxy :: Proxy RoutingValue)+    propJSON (Proxy :: Proxy ShardCount)+    propJSON (Proxy :: Proxy ReplicaCount)+    propJSON (Proxy :: Proxy TemplateName)+    propJSON (Proxy :: Proxy TemplatePattern)+    propJSON (Proxy :: Proxy QueryString)+    propJSON (Proxy :: Proxy FieldName)+    propJSON (Proxy :: Proxy CacheName)+    propJSON (Proxy :: Proxy CacheKey)+    propJSON (Proxy :: Proxy Existence)+    propJSON (Proxy :: Proxy CutoffFrequency)+    propJSON (Proxy :: Proxy Analyzer)+    propJSON (Proxy :: Proxy MaxExpansions)+    propJSON (Proxy :: Proxy Lenient)+    propJSON (Proxy :: Proxy Tiebreaker)+    propJSON (Proxy :: Proxy Boost)+    propJSON (Proxy :: Proxy BoostTerms)+    propJSON (Proxy :: Proxy MinimumMatch)+    propJSON (Proxy :: Proxy DisableCoord)+    propJSON (Proxy :: Proxy IgnoreTermFrequency)+    propJSON (Proxy :: Proxy MinimumTermFrequency)+    propJSON (Proxy :: Proxy MaxQueryTerms)+    propJSON (Proxy :: Proxy Fuzziness)+    propJSON (Proxy :: Proxy PrefixLength)+    propJSON (Proxy :: Proxy TypeName)+    propJSON (Proxy :: Proxy PercentMatch)+    propJSON (Proxy :: Proxy StopWord)+    propJSON (Proxy :: Proxy QueryPath)+    propJSON (Proxy :: Proxy AllowLeadingWildcard)+    propJSON (Proxy :: Proxy LowercaseExpanded)+    propJSON (Proxy :: Proxy EnablePositionIncrements)+    propJSON (Proxy :: Proxy AnalyzeWildcard)+    propJSON (Proxy :: Proxy GeneratePhraseQueries)+    propJSON (Proxy :: Proxy Locale)+    propJSON (Proxy :: Proxy MaxWordLength)+    propJSON (Proxy :: Proxy MinWordLength)+    propJSON (Proxy :: Proxy PhraseSlop)+    propJSON (Proxy :: Proxy MinDocFrequency)+    propJSON (Proxy :: Proxy MaxDocFrequency)+    propJSON (Proxy :: Proxy Filter)+    propJSON (Proxy :: Proxy Query)+    propJSON (Proxy :: Proxy SimpleQueryStringQuery)+    propJSON (Proxy :: Proxy FieldOrFields)+    propJSON (Proxy :: Proxy SimpleQueryFlag)+    propJSON (Proxy :: Proxy RegexpQuery)+    propJSON (Proxy :: Proxy QueryStringQuery)+    propJSON (Proxy :: Proxy RangeQuery)+    propJSON (Proxy :: Proxy PrefixQuery)+    propJSON (Proxy :: Proxy NestedQuery)+    propJSON (Proxy :: Proxy MoreLikeThisFieldQuery)+    propJSON (Proxy :: Proxy MoreLikeThisQuery)+    propJSON (Proxy :: Proxy IndicesQuery)+    propJSON (Proxy :: Proxy HasParentQuery)+    propJSON (Proxy :: Proxy HasChildQuery)+    propJSON (Proxy :: Proxy FuzzyQuery)+    propJSON (Proxy :: Proxy FuzzyLikeFieldQuery)+    propJSON (Proxy :: Proxy FuzzyLikeThisQuery)+    propJSON (Proxy :: Proxy FilteredQuery)+    propJSON (Proxy :: Proxy DisMaxQuery)+    propJSON (Proxy :: Proxy CommonTermsQuery)+    propJSON (Proxy :: Proxy CommonMinimumMatch)+    propJSON (Proxy :: Proxy BoostingQuery)+    propJSON (Proxy :: Proxy BoolQuery)+    propJSON (Proxy :: Proxy MatchQuery)+    propJSON (Proxy :: Proxy MultiMatchQueryType)+    propJSON (Proxy :: Proxy BooleanOperator)+    propJSON (Proxy :: Proxy ZeroTermsQuery)+    propJSON (Proxy :: Proxy MatchQueryType)+    propJSON (Proxy :: Proxy AliasRouting)+    propJSON (Proxy :: Proxy IndexAliasCreate)+    propJSON (Proxy :: Proxy SearchAliasRouting)+    propJSON (Proxy :: Proxy ScoreType)+    propJSON (Proxy :: Proxy Distance)+    propJSON (Proxy :: Proxy DistanceUnit)+    propJSON (Proxy :: Proxy DistanceType)+    propJSON (Proxy :: Proxy OptimizeBbox)+    propJSON (Proxy :: Proxy GeoBoundingBoxConstraint)+    propJSON (Proxy :: Proxy GeoFilterType)+    propJSON (Proxy :: Proxy GeoBoundingBox)+    propJSON (Proxy :: Proxy LatLon)+    propJSON (Proxy :: Proxy RangeExecution)+    prop "RegexpFlags FromJSON/ToJSON roundtrips, removing dups " $ \rfs ->+      let expected = case rfs of+                       SomeRegexpFlags fs -> SomeRegexpFlags (NE.fromList (nub (NE.toList fs)))+                       x -> x+      in parseEither parseJSON (toJSON rfs) === Right expected+    propJSON (Proxy :: Proxy BoolMatch)+    propJSON (Proxy :: Proxy Term)+    propJSON (Proxy :: Proxy MultiMatchQuery)+    propJSON (Proxy :: Proxy IndexSettings)+    propJSON (Proxy :: Proxy UpdatableIndexSetting)+    propJSON (Proxy :: Proxy ReplicaBounds)+    propJSON (Proxy :: Proxy Bytes)+    propJSON (Proxy :: Proxy AllocationPolicy)+    propJSON (Proxy :: Proxy InitialShardCount)+    propJSON (Proxy :: Proxy FSType)+    propJSON (Proxy :: Proxy CompoundFormat)