@@ -10,6 +10,7 @@ module Database.Bloodhound.Types
1010 , rangeToKV
1111 , showText
1212 , unpackId
13+ , mkMatchQuery
1314 , Version(..)
1415 , Status(..)
1516 , Existence(..)
@@ -64,6 +65,36 @@ module Database.Bloodhound.Types
6465 , Missing(..)
6566 , OpenCloseIndex(..)
6667 , Method(..)
68+ , Boost(..)
69+ , MatchQuery(..)
70+ , MultiMatchQuery(..)
71+ , BoolQuery(..)
72+ , BoostingQuery(..)
73+ , CommonTermsQuery(..)
74+ , DisMaxQuery(..)
75+ , FilteredQuery(..)
76+ , FuzzyLikeThisQuery(..)
77+ , FuzzyLikeFieldQuery(..)
78+ , FuzzyQuery(..)
79+ , HasChildQuery(..)
80+ , HasParentQuery(..)
81+ , AnIndicesQuery(..)
82+ , MoreLikeThisQuery(..)
83+ , MoreLikeThisFieldQuery(..)
84+ , NestedQuery(..)
85+ , PrefixQuery(..)
86+ , QueryStringQuery(..)
87+ , SimpleQueryStringQuery(..)
88+ , RangeQuery(..)
89+ , RegexpQuery(..)
90+ , QueryString(..)
91+ , BooleanOperator(..)
92+ , ZeroTermsQuery(..)
93+ , CutoffFrequency(..)
94+ , Analyzer(..)
95+ , MaxExpansions(..)
96+ , Lenient(..)
97+ , MatchQueryType(..)
6798 ) where
6899
69100import Data.Aeson
@@ -82,15 +113,11 @@ data Version = Version { number :: Text
82113 , build_snapshot :: Bool
83114 , lucene_version :: Text } deriving (Show, Generic)
84115
85−data (FromJSON a, ToJSON a) => Status a =
86− Status { ok :: Bool
87− , status :: Int
88− , name :: Text
89− , version :: a
90− , tagline :: Text } deriving (Eq, Show)
91−
92−newtype ShardCount = ShardCount Int deriving (Eq, Show, Generic)
93−newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic)
116+data Status a = Status { ok :: Bool
117+ , status :: Int
118+ , name :: Text
119+ , version :: a
120+ , tagline :: Text } deriving (Eq, Show)
94121
95122data IndexSettings =
96123 IndexSettings { indexShards :: ShardCount
@@ -100,7 +127,6 @@ defaultIndexSettings = IndexSettings (ShardCount 3) (ReplicaCount 2)
100127
101128data Strategy = RoundRobinStrat | RandomStrat | HeadStrat deriving (Eq, Show)
102129
103−newtype Server = Server String deriving (Eq, Show)
104130
105131type Reply = Network.HTTP.Conduit.Response L.ByteString
106132type Method = NHTM.Method
@@ -120,9 +146,9 @@ data FieldDefinition =
120146
121147data MappingField =
122148 MappingField { mappingFieldName :: FieldName
123− , fieldDefinition :: FieldDefinition } deriving (Eq, Show)
149+ , fieldDefinition :: FieldDefinition } deriving (Eq, Show)
124150
125−data Mapping = Mapping { typeName :: Text
151+data Mapping = Mapping { typeName :: TypeName
126152 , fields :: [MappingField] } deriving (Eq, Show)
127153
128154data BulkOperation =
@@ -174,28 +200,48 @@ type PrefixValue = Text
174200
175201data BooleanOperator = And | Or deriving (Eq, Show)
176202
177−newtype IndexName = IndexName String deriving (Eq, Generic, Show)
178−newtype MappingName = MappingName String deriving (Eq, Generic, Show)
179−newtype DocId = DocId String deriving (Eq, Generic, Show)
180−newtype QueryString = QueryString Text deriving (Eq, Show)
181−newtype FieldName = FieldName Text deriving (Eq, Show)
182−newtype CacheName = CacheName Text deriving (Eq, Show)
183−newtype CacheKey = CacheKey Text deriving (Eq, Show)
184−newtype Existence = Existence Bool deriving (Eq, Show)
185−newtype NullValue = NullValue Bool deriving (Eq, Show)
186−newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show)
187−newtype Analyzer = Analyzer Text deriving (Eq, Show)
188−newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show)
189−newtype Lenient = Lenient Bool deriving (Eq, Show)
190−newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show)
191−newtype Boost = Boost Double deriving (Eq, Show)
192−newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show)
193−newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
194−newtype DisableCoord = DisableCoord Bool deriving (Eq, Show)
195−newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show)
196−newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show)
197−newtype Fuzziness = Fuzziness Double deriving (Eq, Show)
198−newtype PrefixLength = PrefixLength Int deriving (Eq, Show)
203+newtype ShardCount = ShardCount Int deriving (Eq, Show, Generic)
204+newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic)
205+newtype Server = Server String deriving (Eq, Show)
206+newtype IndexName = IndexName String deriving (Eq, Generic, Show)
207+newtype MappingName = MappingName String deriving (Eq, Generic, Show)
208+newtype DocId = DocId String deriving (Eq, Generic, Show)
209+newtype QueryString = QueryString Text deriving (Eq, Show)
210+newtype FieldName = FieldName Text deriving (Eq, Show)
211+newtype CacheName = CacheName Text deriving (Eq, Show)
212+newtype CacheKey = CacheKey Text deriving (Eq, Show)
213+newtype Existence = Existence Bool deriving (Eq, Show)
214+newtype NullValue = NullValue Bool deriving (Eq, Show)
215+newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Generic)
216+newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
217+newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, Generic)
218+newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
219+newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show)
220+newtype Boost = Boost Double deriving (Eq, Show, Generic)
221+newtype BoostTerms = BoostTerms Double deriving (Eq, Show)
222+newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show)
223+newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
224+newtype DisableCoord = DisableCoord Bool deriving (Eq, Show)
225+newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show)
226+newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show)
227+newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show)
228+newtype Fuzziness = Fuzziness Double deriving (Eq, Show)
229+newtype PrefixLength = PrefixLength Int deriving (Eq, Show)
230+newtype TypeName = TypeName Text deriving (Eq, Show)
231+newtype PercentMatch = PercentMatch Double deriving (Eq, Show)
232+newtype StopWord = StopWord Text deriving (Eq, Show)
233+newtype QueryPath = QueryPath Text deriving (Eq, Show)
234+newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show)
235+newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show)
236+newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show)
237+newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show)
238+newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show)
239+newtype Locale = Locale Text deriving (Eq, Show)
240+newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show)
241+newtype MinWordLength = MinWordLength Int deriving (Eq, Show)
242+newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show)
243+newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show)
244+newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show)
199245
200246unpackId :: DocId -> String
201247unpackId (DocId docId) = docId
@@ -212,21 +258,173 @@ data Search = Search { queryBody :: Maybe Query
212258 , from :: From
213259 , size :: Size } deriving (Eq, Show)
214260
215−data Query = TermQuery Term (Maybe Boost)
216− | QueryMatchQuery MatchQuery
217− | QueryMultiMatchQuery MultiMatchQuery
218− | QueryBoolQuery BoolQuery
219− | QueryBoostingQuery BoostingQuery
220− | QueryCommonTermsQuery CommonTermsQuery
221− | ConstantScoreFilter Filter Boost
222− | ConstantScoreQuery Query Boost
223− | QueryDisMaxQuery DisMaxQuery
224− | QueryFilteredQuery FilteredQuery
225− | QueryFuzzyLikeThisQuery FuzzyLikeThisQuery
226− | QueryFuzzyLikeFieldQuery FuzzyLikeFieldQuery
227− | QueryFuzzyQuery FuzzyQuery
261+data Query = TermQuery Term (Maybe Boost)
262+ | TermsQuery [Term] MinimumMatch
263+ | QueryMatchQuery MatchQuery
264+ | QueryMultiMatchQuery MultiMatchQuery
265+ | QueryBoolQuery BoolQuery
266+ | QueryBoostingQuery BoostingQuery
267+ | QueryCommonTermsQuery CommonTermsQuery
268+ | ConstantScoreFilter Filter Boost
269+ | ConstantScoreQuery Query Boost
270+ | QueryDisMaxQuery DisMaxQuery
271+ | QueryFilteredQuery FilteredQuery
272+ | QueryFuzzyLikeThisQuery FuzzyLikeThisQuery
273+ | QueryFuzzyLikeFieldQuery FuzzyLikeFieldQuery
274+ | QueryFuzzyQuery FuzzyQuery
275+ | QueryHasChildQuery HasChildQuery
276+ | QueryHasParentQuery HasParentQuery
277+ | IdsQuery MappingName [DocId]
278+ | QueryIndicesQuery AnIndicesQuery
279+ | MatchAllQuery (Maybe Boost)
280+ | QueryMoreLikeThisQuery MoreLikeThisQuery
281+ | QueryMoreLikeThisFieldQuery MoreLikeThisFieldQuery
282+ | QueryNestedQuery NestedQuery
283+ | QueryPrefixQuery PrefixQuery
284+ | QueryQueryStringQuery QueryStringQuery
285+ | QuerySimpleQueryStringQuery SimpleQueryStringQuery
286+ | QueryRangeQuery RangeQuery
287+ | QueryRegexpQuery RegexpQuery
228288 deriving (Eq, Show)
229289
290+-- Possible flags are ALL, ANYSTRING, AUTOMATON, COMPLEMENT,
291+-- EMPTY, INTERSECTION, INTERVAL, or NONE. huh?
292+
293+data RegexpQuery =
294+ RegexpQuery { regexpQueryField :: FieldName
295+ , regexpQuery :: Regexp
296+ , regexpQueryFlags :: RegexpFlags
297+ , regexpQueryCacheName :: CacheName
298+ , regexpQueryCache :: Cache
299+ , regexpQueryCacheKey :: CacheKey } deriving (Eq, Show)
300+
301+data RangeQuery =
302+ RangeQuery { rangeQueryField :: FieldName
303+ , rangeQueryRange :: Either HalfRange Range
304+ , rangeQueryBoost :: Boost } deriving (Eq, Show)
305+
306+data SimpleQueryStringQuery =
307+ SimpleQueryStringQuery { simpleQueryStringQuery :: QueryString
308+ , simpleQueryStringField :: Maybe FieldOrFields
309+ , simpleQueryStringOperator :: Maybe BooleanOperator
310+ , simpleQueryStringAnalyzer :: Maybe Analyzer
311+ , simpleQueryStringFlags :: Maybe [SimpleQueryFlag]
312+ , simpleQueryStringLowercaseExpanded :: Maybe LowercaseExpanded
313+ , simpleQueryStringLocale :: Maybe Locale
314+ } deriving (Eq, Show)
315+
316+data SimpleQueryFlag = SimpleQueryAll
317+ | SimpleQueryNone
318+ | SimpleQueryAnd
319+ | SimpleQueryOr
320+ | SimpleQueryPrefix
321+ | SimpleQueryPhrase
322+ | SimpleQueryPrecedence
323+ | SimpleQueryEscape
324+ | SimpleQueryWhitespace
325+ | SimpleQueryFuzzy
326+ | SimpleQueryNear
327+ | SimpleQuerySlop deriving (Eq, Show)
328+
329+-- use_dis_max and tie_breaker when fields are plural?
330+data QueryStringQuery =
331+ QueryStringQuery { queryStringQuery :: QueryString
332+ , queryStringDefaultField :: Maybe FieldOrFields
333+ , queryStringOperator :: Maybe BooleanOperator
334+ , queryStringAnalyzer :: Maybe Analyzer
335+ , queryStringAllowLeadingWildcard :: Maybe AllowLeadingWildcard
336+ , queryStringLowercaseExpanded :: Maybe LowercaseExpanded
337+ , queryStringEnablePositionIncrements :: Maybe EnablePositionIncrements
338+ , queryStringFuzzyMaxExpansions :: Maybe MaxExpansions
339+ , queryStringFuzziness :: Maybe Fuzziness
340+ , queryStringFuzzyPrefixLength :: Maybe PrefixLength
341+ , queryStringPhraseSlop :: Maybe PhraseSlop
342+ , queryStringBoost :: Maybe Boost
343+ , queryStringAnalyzeWildcard :: Maybe AnalyzeWildcard
344+ , queryStringGeneratePhraseQueries :: Maybe GeneratePhraseQueries
345+ , queryStringMinimumShouldMatch :: Maybe MinimumMatch
346+ , queryStringLenient :: Maybe Lenient
347+ , queryStringLocale :: Maybe Locale
348+ } deriving (Eq, Show)
349+
350+data FieldOrFields = FofField FieldName
351+ | FofFields [FieldName] deriving (Eq, Show)
352+
353+data PrefixQuery =
354+ PrefixQuery { prefixQueryField :: FieldName
355+ , prefixQueryPrefixValue :: Text
356+ , prefixQueryBoost :: Maybe Boost } deriving (Eq, Show)
357+
358+data NestedQuery =
359+ NestedQuery { nestedQueryPath :: QueryPath
360+ , nestedQueryScoreType :: ScoreType
361+ , nestedQuery :: Query } deriving (Eq, Show)
362+
363+data MoreLikeThisFieldQuery =
364+ MoreLikeThisFieldQuery { moreLikeThisFieldText :: Text
365+ , moreLikeThisFieldFields :: FieldName
366+ -- default 0.3 (30%)
367+ , moreLikeThisFieldPercentMatch :: Maybe PercentMatch
368+ , moreLikeThisFieldMinimumTermFreq :: Maybe MinimumTermFrequency
369+ , moreLikeThisFieldMaxQueryTerms :: Maybe MaxQueryTerms
370+ , moreLikeThisFieldStopWords :: Maybe [StopWord]
371+ , moreLikeThisFieldMinDocFrequency :: Maybe MinDocFrequency
372+ , moreLikeThisFieldMaxDocFrequency :: Maybe MaxDocFrequency
373+ , moreLikeThisFieldMinWordLength :: Maybe MinWordLength
374+ , moreLikeThisFieldMaxWordLength :: Maybe MaxWordLength
375+ , moreLikeThisFieldBoostTerms :: Maybe BoostTerms
376+ , moreLikeThisFieldBoost :: Maybe Boost
377+ , moreLikeThisFieldAnalyzer :: Maybe Analyzer
378+ } deriving (Eq, Show)
379+
380+data MoreLikeThisQuery =
381+ MoreLikeThisQuery { moreLikeThisText :: Text
382+ , moreLikeThisFields :: Maybe [FieldName]
383+ -- default 0.3 (30%)
384+ , moreLikeThisPercentMatch :: Maybe PercentMatch
385+ , moreLikeThisMinimumTermFreq :: Maybe MinimumTermFrequency
386+ , moreLikeThisMaxQueryTerms :: Maybe MaxQueryTerms
387+ , moreLikeThisStopWords :: Maybe [StopWord]
388+ , moreLikeThisMinDocFrequency :: Maybe MinDocFrequency
389+ , moreLikeThisMaxDocFrequency :: Maybe MaxDocFrequency
390+ , moreLikeThisMinWordLength :: Maybe MinWordLength
391+ , moreLikeThisMaxWordLength :: Maybe MaxWordLength
392+ , moreLikeThisBoostTerms :: Maybe BoostTerms
393+ , moreLikeThisBoost :: Maybe Boost
394+ , moreLikeThisAnalyzer :: Maybe Analyzer
395+ } deriving (Eq, Show)
396+
397+data AnIndicesQuery = AnIndexQuery IndexQuery
398+ | AnIndicesQuery IndicesQuery deriving (Eq, Show)
399+
400+
401+data IndicesQuery =
402+ IndicesQuery { indicesQueryIndexName :: IndexName
403+ , indicesQuery :: Query
404+ -- default "all"
405+ , indicesQueryNoMatch :: Maybe Query } deriving (Eq, Show)
406+
407+data IndexQuery =
408+ IndexQuery { indexQueryIndexName :: IndexName
409+ , indexQuery :: Query
410+ -- default "all"
411+ , indexQueryNoMatch :: Maybe Query } deriving (Eq, Show)
412+
413+data HasParentQuery =
414+ HasParentQuery { hasParentQueryType :: TypeName
415+ , hasParentQuery :: Query
416+ , hasParentQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
417+
418+data HasChildQuery =
419+ HasChildQuery { hasChildQueryType :: TypeName
420+ , hasChildQuery :: Query
421+ , hasChildQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
422+
423+data ScoreType = ScoreTypeMax
424+ | ScoreTypeSum
425+ | ScoreTypeAvg
426+ | ScoreTypeNone deriving (Eq, Show)
427+
230428data FuzzyQuery = FuzzyQuery { fuzzyQueryField :: FieldName
231429 , fuzzyQueryValue :: Text
232430 , fuzzyQueryPrefixLength :: PrefixLength
@@ -373,17 +571,7 @@ data RangeExecution = RangeExecutionIndex
373571 | RangeExecutionFielddata deriving (Eq, Show)
374572
375573newtype Regexp = Regexp Text deriving (Eq, Show)
376−data RegexpFlags = RegexpAll
377− | Complement
378− | Interval
379− | Intersection
380− | AnyString
381− | CompInterval
382− | CompIntersection
383− | CompAnyString
384− | IntervalIntersection
385− | IntervalAnyString
386− | IntersectionAnyString deriving (Eq, Show)
574+newtype RegexpFlags = RegexpFlags Text deriving (Eq, Show)
387575
388576halfRangeToKV :: HalfRange -> (Text, Double)
389577halfRangeToKV (HalfRangeLt (LessThan n)) = ("lt", n)