diff --git a/be/src/exprs/bitmap_function.cpp b/be/src/exprs/bitmap_function.cpp index 9e0cb9815eb0a8..8ca25aa684b270 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 5fd0d9613a6663..9739b3559e2b02 100644 --- a/be/src/exprs/bitmap_function.h +++ b/be/src/exprs/bitmap_function.h @@ -55,6 +55,7 @@ class BitmapFunctions { 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 1c5e85d55b9638..b89569a4f8fb23 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -1287,6 +1287,17 @@ class BitmapValue { 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 7407d8400f9674..5c7e57c66fd846 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 00000000000000..484f8158f5fcf7 --- /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 00000000000000..09e8486189d71b --- /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 26d4e3c07e06d8..378e329517c2ef 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -814,6 +814,8 @@ '_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', '...'],