From 81875f4cfc9570cdc1b88e5ae205a960a147dd2c Mon Sep 17 00:00:00 2001 From: JP Rosevear Date: Wed, 22 Mar 2017 00:20:42 -0400 Subject: [PATCH] Support avg, cardinality, min, max and sum metric aggregates (#877) --- lib/searchkick/query.rb | 8 +++++--- test/aggs_test.rb | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+), 3 deletions(-) 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