1{-# LANGUAGE DeriveGeneric #-}
3module Database.Bloodhound.Types
35 , GeoBoundingBoxConstraint(..)
75 , CommonTermsQuery(..)
78 , FuzzyLikeThisQuery(..)
79 , FuzzyLikeFieldQuery(..)
84 , MoreLikeThisQuery(..)
85 , MoreLikeThisFieldQuery(..)
88 , QueryStringQuery(..)
89 , SimpleQueryStringQuery(..)
100 , MultiMatchQueryType(..)
104 , CommonMinimumMatch(..)
105 , MinimumMatchHighLow(..)
108 , IgnoreTermFrequency(..)
115 , MaxDocFrequency(..)
116 , MinDocFrequency(..)
120 , MinimumTermFrequency(..)
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
136 , build_timestamp :: UTCTime
137 , build_snapshot :: Bool
138 , lucene_version :: Text } deriving (Show, Generic)
140data Status a = Status { ok :: Bool
144 , tagline :: Text } deriving (Eq, Show)
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
166 | ByteType deriving (Eq, Show)
168data FieldDefinition =
169 FieldDefinition { fieldType :: FieldType } deriving (Eq, Show)
172 MappingField { mappingFieldName :: FieldName
173 , fieldDefinition :: FieldDefinition } deriving (Eq, Show)
175data Mapping = Mapping { typeName :: TypeName
176 , fields :: [MappingField] } deriving (Eq, Show)
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
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)
197 DefaultSort { sortFieldName :: FieldName
198 , sortOrder :: SortOrder
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
210 | CustomMissing Text deriving (Eq, Show)
212data SortMode = SortMin
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
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
277data Search = Search { queryBody :: Maybe Query
278 , filterBody :: Maybe Filter
279 , sortBody :: Maybe Sort
281 , trackSortScores :: TrackSortScores
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
315 RegexpQuery { regexpQueryField :: FieldName
316 , regexpQuery :: Regexp
317 , regexpQueryFlags :: RegexpFlags
318 , regexpQueryCacheName :: CacheName
319 , regexpQueryCache :: Cache
320 , regexpQueryCacheKey :: CacheKey } deriving (Eq, Show)
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
343 | SimpleQueryPrecedence
345 | SimpleQueryWhitespace
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)
375 PrefixQuery { prefixQueryField :: FieldName
376 , prefixQueryPrefixValue :: Text
377 , prefixQueryBoost :: Maybe Boost } deriving (Eq, Show)
380 NestedQuery { nestedQueryPath :: QueryPath
381 , nestedQueryScoreType :: ScoreType
382 , nestedQuery :: Query } deriving (Eq, Show)
384data MoreLikeThisFieldQuery =
385 MoreLikeThisFieldQuery { moreLikeThisFieldText :: Text
386 , moreLikeThisFieldFields :: FieldName
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]
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)
420 IndicesQuery { indicesQueryIndices :: [IndexName]
421 , indicesQuery :: Query
423 , indicesQueryNoMatch :: Maybe Query } deriving (Eq, Show)
426 HasParentQuery { hasParentQueryType :: TypeName
427 , hasParentQuery :: Query
428 , hasParentQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
431 HasChildQuery { hasChildQueryType :: TypeName
432 , hasChildQuery :: Query
433 , hasChildQueryScoreType :: Maybe ScoreType } deriving (Eq, Show)
435data ScoreType = ScoreTypeMax
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)
472 FilteredQuery { filteredQuery :: Query
473 , filteredFilter :: Filter } deriving (Eq, Show)
475data DisMaxQuery = DisMaxQuery { disMaxQueries :: [Query]
477 , disMaxTiebreaker :: Tiebreaker
478 , disMaxBoost :: Maybe Boost
479 } deriving (Eq, Show)
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
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
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]
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
571data ZeroTermsQuery = ZeroTermsNone | ZeroTermsAll deriving (Eq, Show)
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)
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)
635 GeoPoint { geoField :: FieldName
636 , latLon :: LatLon} deriving (Eq, Show)
638data DistanceUnit = Miles
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)
656 Distance { coefficient :: Double
657 , unit :: DistanceUnit } deriving (Eq, Show)
660 DistanceRange { distanceFrom :: Distance
661 , distanceTo :: Distance } deriving (Eq, Show)
663data FromJSON a => SearchResult a =
664 SearchResult { took :: Int
666 , shards :: ShardResult
667 , searchHits :: SearchHits a } deriving (Eq, Show)
671data FromJSON a => SearchHits a =
672 SearchHits { hitsTotal :: Int
674 , hits :: [Hit a] } deriving (Eq, Show)
676data FromJSON a => Hit a =
677 Hit { hitIndex :: IndexName
678 , hitType :: MappingName
681 , hitSource :: a } deriving (Eq, Show)
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]
692-- maybeJsonF :: (ToJSON (f Value), ToJSON a, Functor f) =>
693-- Text -> Maybe (f a) -> [(Text, Value)]
694maybeJsonF field (Just value) = [field .= fmap toJSON value]
697showText :: Show a => a -> Text
698showText = T.pack . show
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list