You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by kx...@apache.org on 2023/10/18 11:26:26 UTC
[doris] 01/09: [feature](function) support bitmap type in min/max_by agg function (#25430)
This is an automated email from the ASF dual-hosted git repository.
kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 6e2d3e98a15dec0dec3761ccf967f7756fd1975b
Author: zhangstar333 <87...@users.noreply.github.com>
AuthorDate: Mon Oct 16 11:05:32 2023 +0800
[feature](function) support bitmap type in min/max_by agg function (#25430)
support bitmap type in min/max_by agg function
---
.../aggregate_function_min_max_by.h | 60 ++++++++++++++++++++++
.../test_aggregate_all_functions2.out | 14 +++++
.../test_aggregate_all_functions2.groovy | 33 +++++++++++-
3 files changed, 106 insertions(+), 1 deletion(-)
diff --git a/be/src/vec/aggregate_functions/aggregate_function_min_max_by.h b/be/src/vec/aggregate_functions/aggregate_function_min_max_by.h
index ca21db0c114..b7a2f5c159d 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_min_max_by.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_min_max_by.h
@@ -18,15 +18,70 @@
#pragma once
#include "common/logging.h"
+#include "util/bitmap_value.h"
#include "vec/aggregate_functions/aggregate_function.h"
#include "vec/aggregate_functions/aggregate_function_min_max.h"
#include "vec/aggregate_functions/helpers.h"
+#include "vec/columns/column_complex.h"
#include "vec/columns/column_decimal.h"
#include "vec/columns/column_vector.h"
#include "vec/common/assert_cast.h"
+#include "vec/data_types/data_type_bitmap.h"
#include "vec/io/io_helper.h"
namespace doris::vectorized {
+
+/// For bitmap value
+struct BitmapValueData {
+private:
+ using Self = BitmapValueData;
+ bool has_value = false;
+ BitmapValue value;
+
+public:
+ BitmapValueData() = default;
+ BitmapValueData(bool has_value_, BitmapValue value_) : has_value(has_value_), value(value_) {}
+ [[nodiscard]] bool has() const { return has_value; }
+
+ void insert_result_into(IColumn& to) const {
+ if (has()) {
+ assert_cast<ColumnBitmap&>(to).get_data().push_back(value);
+ } else {
+ assert_cast<ColumnBitmap&>(to).insert_default();
+ }
+ }
+
+ void reset() {
+ if (has()) {
+ has_value = false;
+ }
+ }
+
+ void write(BufferWritable& buf) const {
+ write_binary(has(), buf);
+ if (has()) {
+ DataTypeBitMap::serialize_as_stream(value, buf);
+ }
+ }
+
+ void read(BufferReadable& buf, Arena* arena) {
+ read_binary(has_value, buf);
+ if (has()) {
+ DataTypeBitMap::deserialize_as_stream(value, buf);
+ }
+ }
+
+ void change(const IColumn& column, size_t row_num, Arena*) {
+ has_value = true;
+ value = assert_cast<const ColumnBitmap&>(column).get_data()[row_num];
+ }
+
+ void change(const Self& to, Arena*) {
+ has_value = true;
+ value = to.value;
+ }
+};
+
template <typename VT, typename KT>
struct AggregateFunctionMinMaxByBaseData {
protected:
@@ -229,6 +284,11 @@ AggregateFunctionPtr create_aggregate_function_min_max_by(const String& name,
SingleValueDataFixed<UInt64>>(
argument_types, result_is_nullable);
}
+ if (which.idx == TypeIndex::BitMap) {
+ return create_aggregate_function_min_max_by_impl<AggregateFunctionTemplate, Data,
+ BitmapValueData>(argument_types,
+ result_is_nullable);
+ }
return nullptr;
}
diff --git a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.out b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.out
index a73761131e0..39895527107 100644
--- a/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.out
+++ b/regression-test/data/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.out
@@ -104,3 +104,17 @@
-- !select_count2 --
15
+-- !select_minmax1 --
+20200622 1 \N
+20200622 2 \N
+20200622 3 \N
+
+-- !select_minmax2 --
+20200622
+
+-- !select_minmax3 --
+287667876573
+
+-- !select_minmax4 --
+243
+
diff --git a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.groovy b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.groovy
index b9ff46f22cf..823a73e700d 100644
--- a/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.groovy
+++ b/regression-test/suites/query_p0/sql_functions/aggregate_functions/test_aggregate_all_functions2.groovy
@@ -81,5 +81,36 @@ suite("test_aggregate_all_functions2") {
qt_select_topn_array6 """ select topn_array(k11,3,100) from baseall; """
qt_select_count1 """ select count(distinct k1,k2,k5) from baseall; """
qt_select_count2 """ select count(distinct k1,k2,cast(k5 as decimalv3(38,18))) from baseall; """
-
+
+
+ sql "DROP DATABASE IF EXISTS metric_table"
+ sql """
+ CREATE TABLE `metric_table` (
+ `datekey` int(11) NULL,
+ `hour` int(11) NULL,
+ `device_id` bitmap BITMAP_UNION NOT NULL
+ ) ENGINE=OLAP
+ AGGREGATE KEY(`datekey`, `hour`)
+ COMMENT 'OLAP'
+ DISTRIBUTED BY HASH(`datekey`, `hour`) BUCKETS 1
+ PROPERTIES (
+ "replication_allocation" = "tag.location.default: 1",
+ "is_being_synced" = "false",
+ "storage_format" = "V2",
+ "light_schema_change" = "true",
+ "disable_auto_compaction" = "false",
+ "enable_single_replica_compaction" = "false"
+ );
+ """
+ sql """
+ insert into metric_table values
+ (20200622, 1, to_bitmap(243)),
+ (20200622, 2, bitmap_from_array([1,2,3,4,5,434543])),
+ (20200622, 3, to_bitmap(287667876573));
+ """
+
+ qt_select_minmax1 """ select * from metric_table order by hour; """
+ qt_select_minmax2 """ select max_by(datekey,hour) from metric_table; """
+ qt_select_minmax3 """ select bitmap_to_string(max_by(device_id,hour)) from metric_table; """
+ qt_select_minmax4 """ select bitmap_to_string(min_by(device_id,hour)) from metric_table; """
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org