git.iko.soy/typeable/bloodhound
on master help sign in
Add support for cardinality aggregations
06dc6f4Alistair Bush
src/Database/Bloodhound/Types.hs+16
@@ -45,6 +45,7 @@ module Database.Bloodhound.Types
45 , mkTermsAggregation
45 , mkTermsAggregation
46 , mkTermsScriptAggregation
46 , mkTermsScriptAggregation
47 , mkDateHistogram
47 , mkDateHistogram
48+ , mkCardinalityAggregation
48 , mkDocVersion
49 , mkDocVersion
49 , docVersionNumber
50 , docVersionNumber
50 , toMissing
51 , toMissing
@@ -310,6 +311,7 @@ module Database.Bloodhound.Types
310 , MissingAggregation(..)
311 , MissingAggregation(..)
311 , ValueCountAggregation(..)
312 , ValueCountAggregation(..)
312 , FilterAggregation(..)
313 , FilterAggregation(..)
314+ , CardinalityAggregation(..)
313 , DateHistogramAggregation(..)
315 , DateHistogramAggregation(..)
314 , DateRangeAggregation(..)
316 , DateRangeAggregation(..)
315 , DateRangeAggRange(..)
317 , DateRangeAggRange(..)
@@ -1694,6 +1696,7 @@ data Interval = Year
1694 | FractionalInterval Float TimeInterval deriving (Eq, Read, Show, Generic, Typeable)
1696 | FractionalInterval Float TimeInterval deriving (Eq, Read, Show, Generic, Typeable)
1695
1697
1696data Aggregation = TermsAgg TermsAggregation
1698data Aggregation = TermsAgg TermsAggregation
1699+ | CardinalityAgg CardinalityAggregation
1697 | DateHistogramAgg DateHistogramAggregation
1700 | DateHistogramAgg DateHistogramAggregation
1698 | ValueCountAgg ValueCountAggregation
1701 | ValueCountAgg ValueCountAggregation
1699 | FilterAgg FilterAggregation
1702 | FilterAgg FilterAggregation
@@ -1716,6 +1719,10 @@ data TermsAggregation = TermsAggregation { term :: Either Text Text
1716 , termAggs :: Maybe Aggregations
1719 , termAggs :: Maybe Aggregations
1717 } deriving (Eq, Read, Show, Generic, Typeable)
1720 } deriving (Eq, Read, Show, Generic, Typeable)
1718
1721
1722+data CardinalityAggregation = CardinalityAggregation { cardinalityField :: FieldName,
1723+ precisionThreshold :: Maybe Int
1724+ } deriving (Eq, Read, Show, Generic, Typeable)
1725+
1719data DateHistogramAggregation = DateHistogramAggregation { dateField :: FieldName
1726data DateHistogramAggregation = DateHistogramAggregation { dateField :: FieldName
1720 , dateInterval :: Interval
1727 , dateInterval :: Interval
1721 , dateFormat :: Maybe Text
1728 , dateFormat :: Maybe Text
@@ -1774,6 +1781,9 @@ mkTermsScriptAggregation t = TermsAggregation (Right t) Nothing Nothing Nothing
1774mkDateHistogram :: FieldName -> Interval -> DateHistogramAggregation
1781mkDateHistogram :: FieldName -> Interval -> DateHistogramAggregation
1775mkDateHistogram t i = DateHistogramAggregation t i Nothing Nothing Nothing Nothing Nothing Nothing
1782mkDateHistogram t i = DateHistogramAggregation t i Nothing Nothing Nothing Nothing Nothing Nothing
1776
1783
1784+mkCardinalityAggregation :: FieldName -> CardinalityAggregation
1785+mkCardinalityAggregation t = CardinalityAggregation t Nothing
1786+
1777instance ToJSON Version where
1787instance ToJSON Version where
1778 toJSON Version {..} = object ["number" .= number
1788 toJSON Version {..} = object ["number" .= number
1779 ,"build_hash" .= build_hash
1789 ,"build_hash" .= build_hash
@@ -1864,6 +1874,12 @@ instance ToJSON Aggregation where
1864 where
1874 where
1865 toJSON' x = case x of { Left y -> "field" .= y; Right y -> "script" .= y }
1875 toJSON' x = case x of { Left y -> "field" .= y; Right y -> "script" .= y }
1866
1876
1877+ toJSON (CardinalityAgg (CardinalityAggregation field precisionThreshold)) =
1878+ object ["cardinality" .= omitNulls [ "field" .= field,
1879+ "precisionThreshold" .= precisionThreshold
1880+ ]
1881+ ]
1882+
1867 toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =
1883 toJSON (DateHistogramAgg (DateHistogramAggregation field interval format preZone postZone preOffset postOffset dateHistoAggs)) =
1868 omitNulls ["date_histogram" .= omitNulls [ "field" .= field,
1884 omitNulls ["date_histogram" .= omitNulls [ "field" .= field,
1869 "interval" .= interval,
1885 "interval" .= interval,
tests/tests.hs+11
@@ -1244,6 +1244,17 @@ main = hspec $ do
1244 searchExpectAggs search
1244 searchExpectAggs search
1245 searchValidBucketAgg search "users" toTerms
1245 searchValidBucketAgg search "users" toTerms
1246
1246
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+
1247 it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
1258 it "can give collection hint parameters to term aggregations" $ when' (atleast es13) $ withTestEnv $ do
1248 _ <- insertData
1259 _ <- insertData
1249 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }
1260 let terms = TermsAgg $ (mkTermsAggregation "user") { termCollectMode = Just BreadthFirst }