From 1e8c4584abc813308f47f8dc26c6bbe469044d09 Mon Sep 17 00:00:00 2001 From: Patrick Date: Thu, 8 Apr 2021 09:11:32 +0800 Subject: [PATCH] [Function] Add BE udf bitmap_min (#2538) (#5581) this function will return the min result of the input bitmap . --- be/src/exprs/bitmap_function.cpp | 13 +++++ be/src/exprs/bitmap_function.h | 1 + be/src/util/bitmap_value.h | 11 ++++ be/test/exprs/bitmap_function_test.cpp | 21 +++++++ .../bitmap-functions/bitmap_min.md | 55 +++++++++++++++++++ .../bitmap-functions/bitmap_min.md | 55 +++++++++++++++++++ gensrc/script/doris_builtins_functions.py | 2 + 7 files changed, 158 insertions(+) create mode 100644 docs/en/sql-reference/sql-functions/bitmap-functions/bitmap_min.md create mode 100644 docs/zh-CN/sql-reference/sql-functions/bitmap-functions/bitmap_min.md diff --git a/be/src/exprs/bitmap_function.cpp b/be/src/exprs/bitmap_function.cpp index 9e0cb9815e..8ca25aa684 100644 --- a/be/src/exprs/bitmap_function.cpp +++ b/be/src/exprs/bitmap_function.cpp @@ -340,6 +340,19 @@ BigIntVal BitmapFunctions::bitmap_count(FunctionContext* ctx, const StringVal& s } } +BigIntVal BitmapFunctions::bitmap_min(FunctionContext* ctx, const StringVal& src) { + if (src.is_null) { + return BigIntVal::null(); + } + + if (src.len == 0) { + return reinterpret_cast(src.ptr)->minimum(); + } else { + auto bitmap = BitmapValue((char*)src.ptr); + return bitmap.minimum(); + } +} + StringVal BitmapFunctions::to_bitmap(doris_udf::FunctionContext* ctx, const doris_udf::StringVal& src) { BitmapValue bitmap; diff --git a/be/src/exprs/bitmap_function.h b/be/src/exprs/bitmap_function.h index 5fd0d9613a..9739b3559e 100644 --- a/be/src/exprs/bitmap_function.h +++ b/be/src/exprs/bitmap_function.h @@ -55,6 +55,7 @@ public: static void nullable_bitmap_init(FunctionContext* ctx, StringVal* dst); static void bitmap_intersect(FunctionContext* ctx, const StringVal& src, StringVal* dst); static BigIntVal bitmap_count(FunctionContext* ctx, const StringVal& src); + static BigIntVal bitmap_min(FunctionContext* ctx, const StringVal& str); static StringVal bitmap_serialize(FunctionContext* ctx, const StringVal& src); static StringVal to_bitmap(FunctionContext* ctx, const StringVal& src); diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h index 1c5e85d55b..b89569a4f8 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -1287,6 +1287,17 @@ public: return true; } + BigIntVal minimum() { + switch (_type) { + case SINGLE: + return BigIntVal(_sv); + case BITMAP: + return BigIntVal(_bitmap.minimum()); + default: + return BigIntVal::null(); + } + } + // TODO limit string size to avoid OOM std::string to_string() const { std::stringstream ss; diff --git a/be/test/exprs/bitmap_function_test.cpp b/be/test/exprs/bitmap_function_test.cpp index 7407d8400f..5c7e57c66f 100644 --- a/be/test/exprs/bitmap_function_test.cpp +++ b/be/test/exprs/bitmap_function_test.cpp @@ -218,6 +218,27 @@ TEST_F(BitmapFunctionsTest, bitmap_count) { ASSERT_EQ(BigIntVal(0), null_bitmap); } +TEST_F(BitmapFunctionsTest, bitmap_min) { + BigIntVal result = BitmapFunctions::bitmap_min(ctx, StringVal::null()); + ASSERT_TRUE(result.is_null()); + + StringVal empty_str = convert_bitmap_to_string(ctx, BitmapValue()); + result = BitmapFunctions::bitmap_min(ctx, empty_str); + ASSERT_TRUE(result.is_null()); + + StringVal bitmap_str = convert_bitmap_to_string(ctx, BitmapValue(1024)); + result = BitmapFunctions::bitmap_min(ctx, bitmap_str); + ASSERT_EQ(BigIntVal(1024), result); + + bitmap_str = convert_bitmap_to_string(ctx, BitmapValue({1024, 1})); + result = BitmapFunctions::bitmap_min(ctx, bitmap_str); + ASSERT_EQ(BigIntVal(1), result); + + bitmap_str = convert_bitmap_to_string(ctx, BitmapValue({1024, 3, 2})); + result = BitmapFunctions::bitmap_min(ctx, bitmap_str); + ASSERT_EQ(BigIntVal(2), result); +} + // test intersect_count template void test_bitmap_intersect(FunctionContext* ctx, ValType key1, ValType key2) { diff --git a/docs/en/sql-reference/sql-functions/bitmap-functions/bitmap_min.md b/docs/en/sql-reference/sql-functions/bitmap-functions/bitmap_min.md new file mode 100644 index 0000000000..484f8158f5 --- /dev/null +++ b/docs/en/sql-reference/sql-functions/bitmap-functions/bitmap_min.md @@ -0,0 +1,55 @@ +--- +{ + "title": "bitmap_min", + "language": "en" +} +--- + + + +# bitmap_min +## description +### Syntax + +`BIGINT BITMAP_MIN(BITMAP input)` + +Calculate and return the min values of a bitmap. + +## example + +``` +mysql> select bitmap_min(bitmap_from_string('')) value; ++-------+ +| value | ++-------+ +| NULL | ++-------+ + +mysql> select bitmap_min(bitmap_from_string('1,9999999999')) value; ++-------+ +| value | ++-------+ +| 1 | ++-------+ +``` + +## keyword + + BITMAP_MIN,BITMAP diff --git a/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/bitmap_min.md b/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/bitmap_min.md new file mode 100644 index 0000000000..09e8486189 --- /dev/null +++ b/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/bitmap_min.md @@ -0,0 +1,55 @@ +--- +{ + "title": "bitmap_min", + "language": "zh-CN" +} +--- + + + +# bitmap_min +## description +### Syntax + +`BIGINT BITMAP_MIN(BITMAP input)` + +计算并返回 bitmap 中的最小值. + +## example + +``` +mysql> select bitmap_min(bitmap_from_string('')) value; ++-------+ +| value | ++-------+ +| NULL | ++-------+ + +mysql> select bitmap_min(bitmap_from_string('1,9999999999')) value; ++-------+ +| value | ++-------+ +| 1 | ++-------+ +``` + +## keyword + + BITMAP_MIN,BITMAP diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 26d4e3c07e..378e329517 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -814,6 +814,8 @@ visible_functions = [ '_ZN5doris15BitmapFunctions15bitmap_containsEPN9doris_udf15FunctionContextERKNS1_9StringValERKNS1_9BigIntValE'], [['bitmap_has_any'], 'BOOLEAN', ['BITMAP','BITMAP'], '_ZN5doris15BitmapFunctions14bitmap_has_anyEPN9doris_udf15FunctionContextERKNS1_9StringValES6_'], + [['bitmap_min'], 'BIGINT', ['BITMAP'], + '_ZN5doris15BitmapFunctions10bitmap_minEPN9doris_udf15FunctionContextERKNS1_9StringValE'], # hash functions [['murmur_hash3_32'], 'INT', ['VARCHAR', '...'],