git.iko.soy/typeable/bloodhound
on master help sign in
Merge pull request #131 from alistair/cardinality_aggs

Add support for cardinality aggregations

commitd555cbaa490e14c98754c2bbaca05c0cfea68d4d authorChris Allen <cma@bitemyapp.com> dateWed 24 Aug 2016, 13:28 (10 years ago) parenta0a33b806dc6f4
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
@@ -1252,6 +1252,17 @@ main = hspec $ do
12521252 searchExpectAggs search
12531253 searchValidBucketAgg search "users" toTerms
12541254
1255+ it "returns cardinality aggregation results" $ withTestEnv $ do
1256+ _ <- insertData
1257+ let cardinality = CardinalityAgg $ mkCardinalityAggregation $ FieldName "user"
1258+ let search = mkAggregateSearch Nothing $ mkAggregations "users" cardinality
1259+ let search' = search { Database.Bloodhound.from = From 0, size = Size 0 }
1260+ searchExpectAggs search'
1261+ let docCountPair k n = (k, object ["value" .= Number n])
1262+ res <- searchTweets search'
1263+ liftIO $
1264+ fmap aggregations res `shouldBe` Right (Just (M.fromList [ docCountPair "users" 1]))
1265+
12551266 it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
12561267 _ <- insertData
12571268 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }