diff --git a/lib/searchkick/query.rb b/lib/searchkick/query.rb index c05ab30..480774f 100644 --- a/lib/searchkick/query.rb +++ b/lib/searchkick/query.rb @@ -2,6 +2,8 @@ module Searchkick class Query extend Forwardable + @@metric_aggs = [:avg, :cardinality, :max, :min, :sum] + attr_reader :klass, :term, :options attr_accessor :body @@ -643,10 +645,10 @@ module Searchkick interval: interval } } - elsif agg_options[:cardinality] + elsif metric = @@metric_aggs.find { |k| agg_options.has_key?(k) } payload[:aggs][field] = { - cardinality: { - field: agg_options[:cardinality][:field] || field + metric => { + field: agg_options[metric][:field] || field } } else diff --git a/test/aggs_test.rb b/test/aggs_test.rb index 7f51347..9269dcb 100644 --- a/test/aggs_test.rb +++ b/test/aggs_test.rb @@ -116,6 +116,20 @@ class AggsTest < Minitest::Test assert_equal 4, products.aggs["products_per_year"]["buckets"].size end + def test_aggs_avg + products = + Product.search("*", { + aggs: { + avg_price: { + avg: { + field: :price + } + } + } + }) + assert_equal 16.5, products.aggs["avg_price"]["value"] + end + def test_aggs_cardinality products = Product.search("*", { @@ -130,6 +144,40 @@ class AggsTest < Minitest::Test assert_equal 3, products.aggs["total_stores"]["value"] end + def test_aggs_min_max + products = + Product.search("*", { + aggs: { + min_price: { + min: { + field: :price + } + }, + max_price: { + max: { + field: :price + } + } + } + }) + assert_equal 5, products.aggs["min_price"]["value"] + assert_equal 25, products.aggs["max_price"]["value"] + end + + def test_aggs_sum + products = + Product.search("*", { + aggs: { + sum_price: { + sum: { + field: :price + } + } + } + }) + assert_equal 66, products.aggs["sum_price"]["value"] + end + protected def buckets_as_hash(agg) -- libgit2 0.21.0