git.iko.soy/typeable/bloodhound
on 28cc2ae help sign in
698 lines 30 kB history raw
1{-# LANGUAGE DeriveGeneric #-}
3module Database.Bloodhound.Types
4 ( defaultCache
5 , defaultIndexSettings
6 , halfRangeToKV
7 , maybeJson
8 , maybeJsonF
9 , mkSort
10 , rangeToKV
11 , showText
12 , unpackId
13 , mkMatchQuery
14 , mkMultiMatchQuery
15 , mkBoolQuery
16 , Version(..)
17 , Status(..)
18 , Existence(..)
19 , NullValue(..)
20 , IndexSettings(..)
21 , Server(..)
22 , Reply(..)
23 , EsResult(..)
24 , Query(..)
25 , Search(..)
26 , SearchResult(..)
27 , SearchHits(..)
28 , ShardResult(..)
29 , Hit(..)
30 , Filter(..)
31 , Seminearring(..)
32 , BoolMatch(..)
33 , Term(..)
34 , GeoPoint(..)
35 , GeoBoundingBoxConstraint(..)
36 , GeoBoundingBox(..)
37 , GeoFilterType(..)
38 , Distance(..)
39 , DistanceUnit(..)
40 , DistanceType(..)
41 , DistanceRange(..)
42 , OptimizeBbox(..)
43 , LatLon(..)
44 , Range(..)
45 , HalfRange(..)
46 , RangeExecution(..)
47 , LessThan(..)
48 , LessThanEq(..)
49 , GreaterThan(..)
50 , GreaterThanEq(..)
51 , Regexp(..)
52 , RegexpFlags(..)
53 , FieldName(..)
54 , IndexName(..)
55 , MappingName(..)
56 , DocId(..)
57 , CacheName(..)
58 , CacheKey(..)
59 , BulkOperation(..)
60 , ReplicaCount(..)
61 , ShardCount(..)
62 , Sort(..)
63 , SortMode(..)
64 , SortOrder(..)
65 , SortSpec(..)
66 , DefaultSort(..)
67 , Missing(..)
68 , OpenCloseIndex(..)
69 , Method(..)
70 , Boost(..)
71 , MatchQuery(..)
72 , MultiMatchQuery(..)
73 , BoolQuery(..)
74 , BoostingQuery(..)
75 , CommonTermsQuery(..)
76 , DisMaxQuery(..)
77 , FilteredQuery(..)
78 , FuzzyLikeThisQuery(..)
79 , FuzzyLikeFieldQuery(..)
80 , FuzzyQuery(..)
81 , HasChildQuery(..)
82 , HasParentQuery(..)
83 , IndicesQuery(..)
84 , MoreLikeThisQuery(..)
85 , MoreLikeThisFieldQuery(..)
86 , NestedQuery(..)
87 , PrefixQuery(..)
88 , QueryStringQuery(..)
89 , SimpleQueryStringQuery(..)
90 , RangeQuery(..)
91 , RegexpQuery(..)
92 , QueryString(..)
93 , BooleanOperator(..)
94 , ZeroTermsQuery(..)
95 , CutoffFrequency(..)
96 , Analyzer(..)
97 , MaxExpansions(..)
98 , Lenient(..)
99 , MatchQueryType(..)
100 , MultiMatchQueryType(..)
101 , Tiebreaker(..)
102 , MinimumMatch(..)
103 , DisableCoord(..)
104 , CommonMinimumMatch(..)
105 , MinimumMatchHighLow(..)
106 , PrefixLength(..)
107 , Fuzziness(..)
108 , IgnoreTermFrequency(..)
109 , MaxQueryTerms(..)
110 , ScoreType(..)
111 , TypeName(..)
112 , BoostTerms(..)
113 , MaxWordLength(..)
114 , MinWordLength(..)
115 , MaxDocFrequency(..)
116 , MinDocFrequency(..)
117 , PhraseSlop(..)
118 , StopWord(..)
119 , QueryPath(..)
120 , MinimumTermFrequency(..)
121 , PercentMatch(..)
122 ) where
124import Data.Aeson
125import qualified Data.ByteString.Lazy.Char8 as L
126import Data.Text (Text)
127import qualified Data.Text as T
128import Data.Time.Clock (UTCTime)
129import Database.Bloodhound.Types.Class
130import GHC.Generics (Generic)
131import Network.HTTP.Conduit
132import qualified Network.HTTP.Types.Method as NHTM
134data Version = Version { number :: Text
135 , build_hash :: Text
136 , build_timestamp :: UTCTime
137 , build_snapshot :: Bool
138 , lucene_version :: Text } deriving (Show, Generic)
140data Status a = Status { ok :: Bool
141 , status :: Int
142 , name :: Text
143 , version :: a
144 , tagline :: Text } deriving (Eq, Show)
146data IndexSettings =
147 IndexSettings { indexShards :: ShardCount
148 , indexReplicas :: ReplicaCount } deriving (Eq, Show)
150defaultIndexSettings = IndexSettings (ShardCount 3) (ReplicaCount 2)
152data Strategy = RoundRobinStrat | RandomStrat | HeadStrat deriving (Eq, Show)
155type Reply = Network.HTTP.Conduit.Response L.ByteString
156type Method = NHTM.Method
158data OpenCloseIndex = OpenIndex | CloseIndex deriving (Eq, Show)
160data FieldType = GeoPointType
161 | GeoShapeType
162 | FloatType
163 | IntegerType
164 | LongType
165 | ShortType
166 | ByteType deriving (Eq, Show)
168data FieldDefinition =
169 FieldDefinition { fieldType :: FieldType } deriving (Eq, Show)
171data MappingField =
172 MappingField { mappingFieldName :: FieldName
173 , fieldDefinition :: FieldDefinition } deriving (Eq, Show)
175data Mapping = Mapping { typeName :: TypeName
176 , fields :: [MappingField] } deriving (Eq, Show)
178data BulkOperation =
179 BulkIndex IndexName MappingName DocId Value
180 | BulkCreate IndexName MappingName DocId Value
181 | BulkDelete IndexName MappingName DocId
182 | BulkUpdate IndexName MappingName DocId Value deriving (Eq, Show)
184data EsResult a = EsResult { _index :: Text
185 , _type :: Text
186 , _id :: Text
187 , _version :: Int
188 , found :: Maybe Bool
189 , _source :: a } deriving (Eq, Show)
191type Sort = [SortSpec]
193data SortSpec = DefaultSortSpec DefaultSort
194 | GeoDistanceSortSpec SortOrder GeoPoint DistanceUnit deriving (Eq, Show)
196data DefaultSort =
197 DefaultSort { sortFieldName :: FieldName
198 , sortOrder :: SortOrder
199 -- default False
200 , ignoreUnmapped :: Bool
201 , sortMode :: Maybe SortMode
202 , missingSort :: Maybe Missing
203 , nestedFilter :: Maybe Filter } deriving (Eq, Show)
205data SortOrder = Ascending
206 | Descending deriving (Eq, Show)
208data Missing = LastMissing
209 | FirstMissing
210 | CustomMissing Text deriving (Eq, Show)
212data SortMode = SortMin
213 | SortMax
214 | SortSum
215 | SortAvg deriving (Eq, Show)
217mkSort :: FieldName -> SortOrder -> DefaultSort
218mkSort fieldName sortOrder = DefaultSort fieldName sortOrder False Nothing Nothing Nothing
220type Cache = Bool -- caching on/off
221defaultCache = False
223type PrefixValue = Text
225data BooleanOperator = And | Or deriving (Eq, Show)
227newtype ShardCount = ShardCount Int deriving (Eq, Show, Generic)
228newtype ReplicaCount = ReplicaCount Int deriving (Eq, Show, Generic)
229newtype Server = Server String deriving (Eq, Show)
230newtype IndexName = IndexName String deriving (Eq, Generic, Show)
231newtype MappingName = MappingName String deriving (Eq, Generic, Show)
232newtype DocId = DocId String deriving (Eq, Generic, Show)
233newtype QueryString = QueryString Text deriving (Eq, Show)
234newtype FieldName = FieldName Text deriving (Eq, Show)
235newtype CacheName = CacheName Text deriving (Eq, Show)
236newtype CacheKey = CacheKey Text deriving (Eq, Show)
237newtype Existence = Existence Bool deriving (Eq, Show)
238newtype NullValue = NullValue Bool deriving (Eq, Show)
239newtype CutoffFrequency = CutoffFrequency Double deriving (Eq, Show, Generic)
240newtype Analyzer = Analyzer Text deriving (Eq, Show, Generic)
241newtype MaxExpansions = MaxExpansions Int deriving (Eq, Show, Generic)
242newtype Lenient = Lenient Bool deriving (Eq, Show, Generic)
243newtype Tiebreaker = Tiebreaker Double deriving (Eq, Show, Generic)
244newtype Boost = Boost Double deriving (Eq, Show, Generic)
245newtype BoostTerms = BoostTerms Double deriving (Eq, Show, Generic)
246newtype MinimumMatch = MinimumMatch Int deriving (Eq, Show, Generic)
247newtype MinimumMatchText = MinimumMatchText Text deriving (Eq, Show)
248newtype DisableCoord = DisableCoord Bool deriving (Eq, Show, Generic)
249newtype IgnoreTermFrequency = IgnoreTermFrequency Bool deriving (Eq, Show, Generic)
250newtype MinimumTermFrequency = MinimumTermFrequency Int deriving (Eq, Show, Generic)
251newtype MaxQueryTerms = MaxQueryTerms Int deriving (Eq, Show, Generic)
252newtype Fuzziness = Fuzziness Double deriving (Eq, Show, Generic)
253newtype PrefixLength = PrefixLength Int deriving (Eq, Show, Generic)
254newtype TypeName = TypeName Text deriving (Eq, Show, Generic)
255newtype PercentMatch = PercentMatch Double deriving (Eq, Show, Generic)
256newtype StopWord = StopWord Text deriving (Eq, Show, Generic)
257newtype QueryPath = QueryPath Text deriving (Eq, Show, Generic)
258newtype AllowLeadingWildcard = AllowLeadingWildcard Bool deriving (Eq, Show)
259newtype LowercaseExpanded = LowercaseExpanded Bool deriving (Eq, Show)
260newtype EnablePositionIncrements = EnablePositionIncrements Bool deriving (Eq, Show)
261newtype AnalyzeWildcard = AnalyzeWildcard Bool deriving (Eq, Show)
262newtype GeneratePhraseQueries = GeneratePhraseQueries Bool deriving (Eq, Show)
263newtype Locale = Locale Text deriving (Eq, Show)
264newtype MaxWordLength = MaxWordLength Int deriving (Eq, Show, Generic)
265newtype MinWordLength = MinWordLength Int deriving (Eq, Show, Generic)
266newtype PhraseSlop = PhraseSlop Int deriving (Eq, Show, Generic)
267newtype MinDocFrequency = MinDocFrequency Int deriving (Eq, Show, Generic)
268newtype MaxDocFrequency = MaxDocFrequency Int deriving (Eq, Show, Generic)
270unpackId :: DocId -> String
271unpackId (DocId docId) = docId
273type TrackSortScores = Bool
274type From = Int
275type Size = Int
277data Search = Search { queryBody :: Maybe Query
278 , filterBody :: Maybe Filter
279 , sortBody :: Maybe Sort
280 -- default False
281 , trackSortScores :: TrackSortScores
282 , from :: From
283 , size :: Size } deriving (Eq, Show)
285data Query = TermQuery Term (Maybe Boost)
286 | TermsQuery [Term] MinimumMatch
287 | QueryMatchQuery MatchQuery
288 | QueryMultiMatchQuery MultiMatchQuery
289 | QueryBoolQuery BoolQuery
290 | QueryBoostingQuery BoostingQuery
291 | QueryCommonTermsQuery CommonTermsQuery
292 | ConstantScoreFilter Filter Boost
293 | ConstantScoreQuery Query Boost
294 | QueryDisMaxQuery DisMaxQuery
295 | QueryFilteredQuery FilteredQuery
296 | QueryFuzzyLikeThisQuery FuzzyLikeThisQuery
297 | QueryFuzzyLikeFieldQuery FuzzyLikeFieldQuery
298 | QueryFuzzyQuery FuzzyQuery
299 | QueryHasChildQuery HasChildQuery
300 | QueryHasParentQuery HasParentQuery
301 | IdsQuery MappingName [DocId]
302 | QueryIndicesQuery IndicesQuery
303 | MatchAllQuery (Maybe Boost)
304 | QueryMoreLikeThisQuery MoreLikeThisQuery
305 | QueryMoreLikeThisFieldQuery MoreLikeThisFieldQuery
306 | QueryNestedQuery NestedQuery
307 | QueryPrefixQuery PrefixQuery
308 | QueryQueryStringQuery QueryStringQuery
309 | QuerySimpleQueryStringQuery SimpleQueryStringQuery
310 | QueryRangeQuery RangeQuery
311 | QueryRegexpQuery RegexpQuery
312 deriving (Eq, Show)
314data RegexpQuery =
315 RegexpQuery { regexpQueryField :: FieldName
316 , regexpQuery :: Regexp
317 , regexpQueryFlags :: RegexpFlags
318 , regexpQueryCacheName :: CacheName
319 , regexpQueryCache :: Cache
320 , regexpQueryCacheKey :: CacheKey } deriving (Eq, Show)
322data RangeQuery =
323 RangeQuery { rangeQueryField :: FieldName
324 , rangeQueryRange :: Either HalfRange Range
325 , rangeQueryBoost :: Boost } deriving (Eq, Show)
327data SimpleQueryStringQuery =
328 SimpleQueryStringQuery { simpleQueryStringQuery :: QueryString
329 , simpleQueryStringField :: Maybe FieldOrFields
330 , simpleQueryStringOperator :: Maybe BooleanOperator
331 , simpleQueryStringAnalyzer :: Maybe Analyzer
332 , simpleQueryStringFlags :: Maybe [SimpleQueryFlag]
333 , simpleQueryStringLowercaseExpanded :: Maybe LowercaseExpanded
334 , simpleQueryStringLocale :: Maybe Locale
335 } deriving (Eq, Show)
337data SimpleQueryFlag = SimpleQueryAll
338 | SimpleQueryNone
339 | SimpleQueryAnd
340 | SimpleQueryOr
341 | SimpleQueryPrefix
342 | SimpleQueryPhrase
343 | SimpleQueryPrecedence
344 | SimpleQueryEscape
345 | SimpleQueryWhitespace
346 | SimpleQueryFuzzy
347 | SimpleQueryNear
348 | SimpleQuerySlop deriving (Eq, Show)
350-- use_dis_max and tie_breaker when fields are plural?
351data QueryStringQuery =
352 QueryStringQuery { queryStringQuery :: QueryString
353 , queryStringDefaultField :: Maybe FieldOrFields
354 , queryStringOperator :: Maybe BooleanOperator
355 , queryStringAnalyzer :: Maybe Analyzer
356 , queryStringAllowLeadingWildcard :: Maybe AllowLeadingWildcard
357 , queryStringLowercaseExpanded :: Maybe LowercaseExpanded
358 , queryStringEnablePositionIncrements :: Maybe EnablePositionIncrements
359 , queryStringFuzzyMaxExpansions :: Maybe MaxExpansions
360 , queryStringFuzziness :: Maybe Fuzziness
361 , queryStringFuzzyPrefixLength :: Maybe PrefixLength
362 , queryStringPhraseSlop :: Maybe PhraseSlop
363 , queryStringBoost :: Maybe Boost
364 , queryStringAnalyzeWildcard :: Maybe AnalyzeWildcard
365 , queryStringGeneratePhraseQueries :: Maybe GeneratePhraseQueries
366 , queryStringMinimumShouldMatch :: Maybe MinimumMatch
367 , queryStringLenient :: Maybe Lenient
368 , queryStringLocale :: Maybe Locale
369 } deriving (Eq, Show)
371data FieldOrFields = FofField FieldName
372 | FofFields [FieldName] deriving (Eq, Show)
374data PrefixQuery =
375 PrefixQuery { prefixQueryField :: FieldName
376 , prefixQueryPrefixValue :: Text
377 , prefixQueryBoost :: Maybe Boost } deriving (Eq, Show)
379data NestedQuery =
380 NestedQuery { nestedQueryPath :: QueryPath
381 , nestedQueryScoreType :: ScoreType
382 , nestedQuery :: Query } deriving (Eq, Show)
384data MoreLikeThisFieldQuery =
385 MoreLikeThisFieldQuery { moreLikeThisFieldText :: Text
386 , moreLikeThisFieldFields :: FieldName
387 -- default 0.3 (30%)
388 , moreLikeThisFieldPercentMatch :: Maybe PercentMatch
389 , moreLikeThisFieldMinimumTermFreq :: Maybe MinimumTermFrequency
390 , moreLikeThisFieldMaxQueryTerms :: Maybe MaxQueryTerms
391 , moreLikeThisFieldStopWords :: Maybe [StopWord]
392 , moreLikeThisFieldMinDocFrequency :: Maybe MinDocFrequency
393 , moreLikeThisFieldMaxDocFrequency :: Maybe MaxDocFrequency
394 , moreLikeThisFieldMinWordLength :: Maybe MinWordLength
395 , moreLikeThisFieldMaxWordLength :: Maybe MaxWordLength
396 , moreLikeThisFieldBoostTerms :: Maybe BoostTerms
397 , moreLikeThisFieldBoost :: Maybe Boost
398 , moreLikeThisFieldAnalyzer :: Maybe Analyzer
399 } deriving (Eq, Show)
401data MoreLikeThisQuery =
402 MoreLikeThisQuery { moreLikeThisText :: Text
403 , moreLikeThisFields :: Maybe [FieldName]
404 -- default 0.3 (30%)
405 , moreLikeThisPercentMatch :: Maybe PercentMatch
406 , moreLikeThisMinimumTermFreq :: Maybe MinimumTermFrequency
407 , moreLikeThisMaxQueryTerms :: Maybe MaxQueryTerms
408 , moreLikeThisStopWords :: Maybe [StopWord]
409 , moreLikeThisMinDocFrequency :: Maybe MinDocFrequency
410 , moreLikeThisMaxDocFrequency :: Maybe MaxDocFrequency
411 , moreLikeThisMinWordLength :: Maybe MinWordLength
412 , moreLikeThisMaxWordLength :: Maybe MaxWordLength
413 , moreLikeThisBoostTerms :: Maybe BoostTerms
414 , moreLikeThisBoost :: Maybe Boost
415 , moreLikeThisAnalyzer :: Maybe Analyzer
416 } deriving (Eq, Show)
419data IndicesQuery =
420 IndicesQuery { indicesQueryIndices :: [IndexName]
421 , indicesQuery :: Query
422 -- default "all"
423 , indicesQueryNoMatch :: Maybe Query } deriving (Eq, Show)
425data HasParentQuery =
426 HasParentQuery { hasParentQueryType :: TypeName
427 , hasParentQuery :: Query
428 , hasParentQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
430data HasChildQuery =
431 HasChildQuery { hasChildQueryType :: TypeName
432 , hasChildQuery :: Query
433 , hasChildQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
435data ScoreType = ScoreTypeMax
436 | ScoreTypeSum
437 | ScoreTypeAvg
438 | ScoreTypeNone deriving (Eq, Show)
440data FuzzyQuery = FuzzyQuery { fuzzyQueryField :: FieldName
441 , fuzzyQueryValue :: Text
442 , fuzzyQueryPrefixLength :: PrefixLength
443 , fuzzyQueryMaxExpansions :: MaxExpansions
444 , fuzzyQueryFuzziness :: Fuzziness
445 , fuzzyQueryBoost :: Maybe Boost
446 } deriving (Eq, Show)
448data FuzzyLikeFieldQuery =
449 FuzzyLikeFieldQuery { fuzzyLikeField :: FieldName
450 -- anaphora is good for the soul.
451 , fuzzyLikeFieldText :: Text
452 , fuzzyLikeFieldMaxQueryTerms :: MaxQueryTerms
453 , fuzzyLikeFieldIgnoreTermFrequency :: IgnoreTermFrequency
454 , fuzzyLikeFieldFuzziness :: Fuzziness
455 , fuzzyLikeFieldPrefixLength :: PrefixLength
456 , fuzzyLikeFieldBoost :: Boost
457 , fuzzyLikeFieldAnalyzer :: Maybe Analyzer
458 } deriving (Eq, Show)
460data FuzzyLikeThisQuery =
461 FuzzyLikeThisQuery { fuzzyLikeFields :: [FieldName]
462 , fuzzyLikeText :: Text
463 , fuzzyLikeMaxQueryTerms :: MaxQueryTerms
464 , fuzzyLikeIgnoreTermFrequency :: IgnoreTermFrequency
465 , fuzzyLikeFuzziness :: Fuzziness
466 , fuzzyLikePrefixLength :: PrefixLength
467 , fuzzyLikeBoost :: Boost
468 , fuzzyLikeAnalyzer :: Maybe Analyzer
469 } deriving (Eq, Show)
471data FilteredQuery =
472 FilteredQuery { filteredQuery :: Query
473 , filteredFilter :: Filter } deriving (Eq, Show)
475data DisMaxQuery = DisMaxQuery { disMaxQueries :: [Query]
476 -- default 0.0
477 , disMaxTiebreaker :: Tiebreaker
478 , disMaxBoost :: Maybe Boost
479 } deriving (Eq, Show)
480data MatchQuery =
481 MatchQuery { matchQueryField :: FieldName
482 , matchQueryQueryString :: QueryString
483 , matchQueryOperator :: BooleanOperator
484 , matchQueryZeroTerms :: ZeroTermsQuery
485 , matchQueryCutoffFrequency :: Maybe CutoffFrequency
486 , matchQueryMatchType :: Maybe MatchQueryType
487 , matchQueryAnalyzer :: Maybe Analyzer
488 , matchQueryMaxExpansions :: Maybe MaxExpansions
489 , matchQueryLenient :: Maybe Lenient } deriving (Eq, Show)
491mkMatchQuery :: FieldName -> QueryString -> MatchQuery
492mkMatchQuery field query = MatchQuery field query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing
494data MatchQueryType = MatchPhrase
495 | MatchPhrasePrefix deriving (Eq, Show)
497data MultiMatchQuery =
498 MultiMatchQuery { multiMatchQueryFields :: [FieldName]
499 , multiMatchQueryString :: QueryString
500 , multiMatchQueryOperator :: BooleanOperator
501 , multiMatchQueryZeroTerms :: ZeroTermsQuery
502 , multiMatchQueryTiebreaker :: Maybe Tiebreaker
503 , multiMatchQueryType :: Maybe MultiMatchQueryType
504 , multiMatchQueryCutoffFrequency :: Maybe CutoffFrequency
505 , multiMatchQueryAnalyzer :: Maybe Analyzer
506 , multiMatchQueryMaxExpansions :: Maybe MaxExpansions
507 , multiMatchQueryLenient :: Maybe Lenient } deriving (Eq, Show)
509mkMultiMatchQuery :: [FieldName] -> QueryString -> MultiMatchQuery
510mkMultiMatchQuery fields query =
511 MultiMatchQuery fields query Or ZeroTermsNone Nothing Nothing Nothing Nothing Nothing Nothing
513data MultiMatchQueryType = MultiMatchBestFields
514 | MultiMatchMostFields
515 | MultiMatchCrossFields
516 | MultiMatchPhrase
517 | MultiMatchPhrasePrefix deriving (Eq, Show)
519data BoolQuery = BoolQuery { boolQueryMustMatch :: Maybe Query
520 , boolQueryMustNotMatch :: Maybe Query
521 , boolQueryShouldMatch :: Maybe [Query]
522 , boolQueryMinimumShouldMatch :: Maybe MinimumMatch
523 , boolQueryBoost :: Maybe Boost
524 , boolQueryDisableCoord :: Maybe DisableCoord
525 } deriving (Eq, Show)
527mkBoolQuery :: Maybe Query -> Maybe Query -> Maybe [Query] -> BoolQuery
528mkBoolQuery must mustNot should = BoolQuery must mustNot should Nothing Nothing Nothing
530data BoostingQuery = BoostingQuery { positiveQuery :: Query
531 , negativeQuery :: Query
532 , negativeBoost :: Boost } deriving (Eq, Show)
534data CommonTermsQuery =
535 CommonTermsQuery { commonField :: FieldName
536 , commonQuery :: QueryString
537 , commonCutoffFrequency :: CutoffFrequency
538 , commonLowFreqOperator :: BooleanOperator
539 , commonHighFreqOperator :: BooleanOperator
540 , commonMinimumShouldMatch :: Maybe CommonMinimumMatch
541 , commonBoost :: Maybe Boost
542 , commonAnalyzer :: Maybe Analyzer
543 , commonDisableCoord :: Maybe DisableCoord
544 } deriving (Eq, Show)
546data CommonMinimumMatch = CommonMinimumMatchHighLow MinimumMatchHighLow
547 | CommonMinimumMatch MinimumMatch deriving (Eq, Show)
549data MinimumMatchHighLow =
550 MinimumMatchHighLow { lowFreq :: MinimumMatch
551 , highFreq :: MinimumMatch } deriving (Eq, Show)
553data Filter = AndFilter [Filter] Cache
554 | OrFilter [Filter] Cache
555 | NotFilter Filter Cache
556 | IdentityFilter
557 | BoolFilter BoolMatch
558 | ExistsFilter FieldName -- always cached
559 | GeoBoundingBoxFilter GeoBoundingBoxConstraint GeoFilterType
560 | GeoDistanceFilter GeoPoint Distance DistanceType OptimizeBbox Cache
561 | GeoDistanceRangeFilter GeoPoint DistanceRange
562 | GeoPolygonFilter FieldName [LatLon]
563 | IdsFilter MappingName [DocId]
564 | LimitFilter Int
565 | MissingFilter FieldName Existence NullValue
566 | PrefixFilter FieldName PrefixValue Cache
567 | RangeFilter FieldName (Either HalfRange Range) RangeExecution Cache
568 | RegexpFilter FieldName Regexp RegexpFlags CacheName Cache CacheKey
569 deriving (Eq, Show)
571data ZeroTermsQuery = ZeroTermsNone | ZeroTermsAll deriving (Eq, Show)
573-- lt, lte | gt, gte
574newtype LessThan = LessThan Double deriving (Eq, Show)
575newtype LessThanEq = LessThanEq Double deriving (Eq, Show)
576newtype GreaterThan = GreaterThan Double deriving (Eq, Show)
577newtype GreaterThanEq = GreaterThanEq Double deriving (Eq, Show)
579data HalfRange = HalfRangeLt LessThan
580 | HalfRangeLte LessThanEq
581 | HalfRangeGt GreaterThan
582 | HalfRangeGte GreaterThanEq deriving (Eq, Show)
584data Range = RangeLtGt LessThan GreaterThan
585 | RangeLtGte LessThan GreaterThanEq
586 | RangeLteGt LessThanEq GreaterThan
587 | RangeLteGte LessThanEq GreaterThanEq deriving (Eq, Show)
589data RangeExecution = RangeExecutionIndex
590 | RangeExecutionFielddata deriving (Eq, Show)
592newtype Regexp = Regexp Text deriving (Eq, Show)
593newtype RegexpFlags = RegexpFlags Text deriving (Eq, Show)
595halfRangeToKV :: HalfRange -> (Text, Double)
596halfRangeToKV (HalfRangeLt (LessThan n)) = ("lt", n)
597halfRangeToKV (HalfRangeLte (LessThanEq n)) = ("lte", n)
598halfRangeToKV (HalfRangeGt (GreaterThan n)) = ("gt", n)
599halfRangeToKV (HalfRangeGte (GreaterThanEq n)) = ("gte", n)
601rangeToKV :: Range -> (Text, Double, Text, Double)
602rangeToKV (RangeLtGt (LessThan m) (GreaterThan n)) = ("lt", m, "gt", n)
603rangeToKV (RangeLtGte (LessThan m) (GreaterThanEq n)) = ("lt", m, "gte", n)
604rangeToKV (RangeLteGt (LessThanEq m) (GreaterThan n)) = ("lte", m, "gt", n)
605rangeToKV (RangeLteGte (LessThanEq m) (GreaterThanEq n)) = ("lte", m, "gte", n)
607-- phew. Coulda used Agda style case breaking there but, you know, whatever. :)
609data Term = Term { termField :: Text
610 , termValue :: Text } deriving (Eq, Show)
612data BoolMatch = MustMatch Term Cache
613 | MustNotMatch Term Cache
614 | ShouldMatch [Term] Cache deriving (Eq, Show)
616-- "memory" or "indexed"
617data GeoFilterType = GeoFilterMemory
618 | GeoFilterIndexed deriving (Eq, Show)
621data LatLon = LatLon { lat :: Double
622 , lon :: Double } deriving (Eq, Show)
624data GeoBoundingBox =
625 GeoBoundingBox { topLeft :: LatLon
626 , bottomRight :: LatLon } deriving (Eq, Show)
628data GeoBoundingBoxConstraint =
629 GeoBoundingBoxConstraint { geoBBField :: FieldName
630 , constraintBox :: GeoBoundingBox
631 , bbConstraintcache :: Cache
632 } deriving (Eq, Show)
634data GeoPoint =
635 GeoPoint { geoField :: FieldName
636 , latLon :: LatLon} deriving (Eq, Show)
638data DistanceUnit = Miles
639 | Yards
640 | Feet
641 | Inches
642 | Kilometers
643 | Meters
644 | Centimeters
645 | Millimeters
646 | NauticalMiles deriving (Eq, Show)
648data DistanceType = Arc
649 | SloppyArc -- doesn't exist <1.0
650 | Plane deriving (Eq, Show)
652data OptimizeBbox = OptimizeGeoFilterType GeoFilterType
653 | NoOptimizeBbox deriving (Eq, Show)
655data Distance =
656 Distance { coefficient :: Double
657 , unit :: DistanceUnit } deriving (Eq, Show)
659data DistanceRange =
660 DistanceRange { distanceFrom :: Distance
661 , distanceTo :: Distance } deriving (Eq, Show)
663data FromJSON a => SearchResult a =
664 SearchResult { took :: Int
665 , timedOut :: Bool
666 , shards :: ShardResult
667 , searchHits :: SearchHits a } deriving (Eq, Show)
669type Score = Double
671data FromJSON a => SearchHits a =
672 SearchHits { hitsTotal :: Int
673 , maxScore :: Score
674 , hits :: [Hit a] } deriving (Eq, Show)
676data FromJSON a => Hit a =
677 Hit { hitIndex :: IndexName
678 , hitType :: MappingName
679 , hitDocId :: DocId
680 , hitScore :: Score
681 , hitSource :: a } deriving (Eq, Show)
683data ShardResult =
684 ShardResult { shardTotal :: Int
685 , shardsSuccessful :: Int
686 , shardsFailed :: Int } deriving (Eq, Show, Generic)
688maybeJson :: ToJSON a => Text -> Maybe a -> [(Text, Value)]
689maybeJson field (Just value) = [field .= toJSON value]
690maybeJson _ _ = []
692-- maybeJsonF :: (ToJSON (f Value), ToJSON a, Functor f) =>
693-- Text -> Maybe (f a) -> [(Text, Value)]
694maybeJsonF field (Just value) = [field .= fmap toJSON value]
695maybeJsonF _ _ = []
697showText :: Show a => a -> Text
698showText = T.pack . show