git.iko.soy/typeable/bloodhound
on master help sign in
Add support for cardinality aggregations

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/search-aggregations-metrics-cardinality-aggregation.html

commit06dc6f439865e8d6bb68782be2ca4d541debfc12 authorAlistair Bush <alistair.bush@gmail.com> dateMon 22 Aug 2016, 22:42 (10 years ago) parent1467ffe
2 files changed+27
src/Database/Bloodhound/Types.hs+16 tests/tests.hs+11
src/Database/Bloodhound/Types.hs+16
@@ -45,6 +45,7 @@ module Database.Bloodhound.Types
4545 , mkTermsAggregation
4646 , mkTermsScriptAggregation
4747 , mkDateHistogram
48+ , mkCardinalityAggregation
4849 , mkDocVersion
4950 , docVersionNumber
5051 , toMissing
@@ -310,6 +311,7 @@ module Database.Bloodhound.Types
310311 , MissingAggregation(..)
311312 , ValueCountAggregation(..)
312313 , FilterAggregation(..)
314+ , CardinalityAggregation(..)
313315 , DateHistogramAggregation(..)
314316 , DateRangeAggregation(..)
315317 , DateRangeAggRange(..)
@@ -1694,6 +1696,7 @@ data Interval = Year
16941696 | FractionalInterval Float TimeInterval deriving (Eq, Read, Show, Generic, Typeable)
16951697
16961698data Aggregation = TermsAgg TermsAggregation
1699+ | CardinalityAgg CardinalityAggregation
16971700 | DateHistogramAgg DateHistogramAggregation
16981701 | ValueCountAgg ValueCountAggregation
16991702 | FilterAgg FilterAggregation
@@ -1716,6 +1719,10 @@ data TermsAggregation = TermsAggregation { term :: Either Text Text
17161719 , termAggs :: Maybe Aggregations
17171720 } deriving (Eq, Read, Show, Generic, Typeable)
17181721
1722+data CardinalityAggregation = CardinalityAggregation { cardinalityField :: FieldName,
1723+ precisionThreshold :: Maybe Int
1724+ } deriving (Eq, Read, Show, Generic, Typeable)
1725+
17191726data DateHistogramAggregation = DateHistogramAggregation { dateField :: FieldName
17201727 , dateInterval :: Interval
17211728 , dateFormat :: Maybe Text
@@ -1774,6 +1781,9 @@ mkTermsScriptAggregation t = TermsAggregation (Right t) Nothing Nothing Nothing
17741781mkDateHistogram :: FieldName -> Interval -> DateHistogramAggregation
17751782mkDateHistogram t i = DateHistogramAggregation t i Nothing Nothing Nothing Nothing Nothing Nothing
17761783
1784+mkCardinalityAggregation :: FieldName -> CardinalityAggregation
1785+mkCardinalityAggregation t = CardinalityAggregation t Nothing
1786+
17771787instance ToJSON Version where
17781788 toJSON Version {..} = object ["number" .= number
17791789 ,"build_hash" .= build_hash
@@ -1864,6 +1874,12 @@ instance ToJSON Aggregation where
18641874 where
18651875 toJSON' x = case x of { Left y -> "field" .= y; Right y -> "script" .= y }
18661876
1877+ toJSON (CardinalityAgg (CardinalityAggregation field precisionThreshold)) =
1878+ object ["cardinality" .= omitNulls [ "field" .= field,
1879+ "precisionThreshold" .= precisionThreshold
1880+ ]
1881+ ]
1882+
18671883 toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =
18681884 omitNulls ["date_histogram" .= omitNulls [ "field" .= field,
18691885 "interval" .= interval,
tests/tests.hs+11
@@ -1244,6 +1244,17 @@ main = hspec $ do
12441244 searchExpectAggs search
12451245 searchValidBucketAgg search "users" toTerms
12461246
1247+ it "returns cardinality aggregation results" $ withTestEnv $ do
1248+ _ <- insertData
1249+ let cardinality = CardinalityAgg $ mkCardinalityAggregation $ FieldName "user"
1250+ let search = mkAggregateSearch Nothing $ mkAggregations "users" cardinality
1251+ let search' = search { Database.Bloodhound.from = From 0, size = Size 0 }
1252+ searchExpectAggs search'
1253+ let docCountPair k n = (k, object ["value" .= Number n])
1254+ res <- searchTweets search'
1255+ liftIO $
1256+ fmap aggregations res `shouldBe` Right (Just (M.fromList [ docCountPair "users" 1]))
1257+
12471258 it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
12481259 _ <- insertData
12491260 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }