This is an automated email from the ASF dual-hosted git repository. yangzhg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push: new e69249c sub_bitmap (#6977) e69249c is described below commit e69249c082796a9cc336305358adb49b301956a0 Author: Xinyi Zou <zouxiny...@gmail.com> AuthorDate: Sat Nov 6 13:31:03 2021 +0800 sub_bitmap (#6977) Starting from the offset position, intercept the specified limit bitmap elements and return a bitmap subset. Types of chang --- be/src/exprs/bitmap_function.cpp | 19 +++++++ be/src/exprs/bitmap_function.h | 2 + be/src/util/bitmap_value.h | 26 +++++++++ be/test/exprs/bitmap_function_test.cpp | 57 ++++++++++++++++++++ docs/.vuepress/sidebar/en.js | 1 + docs/.vuepress/sidebar/zh-CN.js | 1 + .../sql-functions/bitmap-functions/sub_bitmap.md | 61 +++++++++++++++++++++ .../sql-functions/bitmap-functions/sub_bitmap.md | 62 ++++++++++++++++++++++ gensrc/script/doris_builtins_functions.py | 4 ++ 9 files changed, 233 insertions(+) diff --git a/be/src/exprs/bitmap_function.cpp b/be/src/exprs/bitmap_function.cpp index ccab0c5..b469c15 100644 --- a/be/src/exprs/bitmap_function.cpp +++ b/be/src/exprs/bitmap_function.cpp @@ -671,6 +671,25 @@ StringVal BitmapFunctions::bitmap_subset_in_range(FunctionContext* ctx, const St return serialize(ctx, &ret_bitmap); } +StringVal BitmapFunctions::sub_bitmap(FunctionContext* ctx, const StringVal& src, + const BigIntVal& offset, const BigIntVal& cardinality_limit) { + if (src.is_null || offset.is_null || cardinality_limit.is_null || cardinality_limit.val <= 0) { + return StringVal::null(); + } + + BitmapValue ret_bitmap; + if (src.len == 0) { + ret_bitmap = *reinterpret_cast<BitmapValue*>(src.ptr); + } else { + BitmapValue bitmap = BitmapValue((char*)src.ptr); + if (bitmap.offset_limit(offset.val, cardinality_limit.val, &ret_bitmap) == 0) { + return StringVal::null(); + } + } + + return serialize(ctx, &ret_bitmap); +} + StringVal BitmapFunctions::bitmap_subset_limit(FunctionContext* ctx, const StringVal& src, const BigIntVal& range_start, const BigIntVal& cardinality_limit) { if (src.is_null || range_start.is_null || cardinality_limit.is_null) { diff --git a/be/src/exprs/bitmap_function.h b/be/src/exprs/bitmap_function.h index 5b166a0..363b9b7 100644 --- a/be/src/exprs/bitmap_function.h +++ b/be/src/exprs/bitmap_function.h @@ -108,6 +108,8 @@ public: const BigIntVal& range_start, const BigIntVal& range_end); static StringVal bitmap_subset_limit(FunctionContext* ctx, const StringVal& src, const BigIntVal& range_start, const BigIntVal& cardinality_limit); + static StringVal sub_bitmap(FunctionContext* ctx, const StringVal& src, + const BigIntVal& offset, const BigIntVal& cardinality_limit); }; } // namespace doris #endif //DORIS_BE_SRC_QUERY_EXPRS_BITMAP_FUNCTION_H diff --git a/be/src/util/bitmap_value.h b/be/src/util/bitmap_value.h index 9bf6f65..6d3710f 100644 --- a/be/src/util/bitmap_value.h +++ b/be/src/util/bitmap_value.h @@ -1489,6 +1489,32 @@ public: break; } } + return count; + } + + /** + * Returns the bitmap elements, starting from the offset position. + * The number of returned elements is limited by the cardinality_limit parameter. + * Analog of the substring string function, but for bitmap. + */ + int64_t offset_limit(const int64_t& offset, const int64_t& limit, BitmapValue* ret_bitmap) { + if (std::abs(offset) >= _bitmap.cardinality()) { + return 0; + } + int64_t abs_offset = offset; + if (offset < 0) { + abs_offset = _bitmap.cardinality() + offset; + } + + int64_t count = 0; + int64_t offset_count = 0; + auto it = _bitmap.begin(); + for (;it != _bitmap.end() && offset_count < abs_offset; ++it) { + ++offset_count; + } + for (;it != _bitmap.end() && count < limit; ++it, ++count) { + ret_bitmap->add(*it); + } return count; } diff --git a/be/test/exprs/bitmap_function_test.cpp b/be/test/exprs/bitmap_function_test.cpp index c753383..8a2a950 100644 --- a/be/test/exprs/bitmap_function_test.cpp +++ b/be/test/exprs/bitmap_function_test.cpp @@ -751,7 +751,64 @@ TEST_F(BitmapFunctionsTest, bitmap_subset_in_range) { res = BitmapFunctions::bitmap_subset_in_range(ctx, bitmap_src, BigIntVal::null(), BigIntVal::null()); ASSERT_TRUE(res.is_null); +} + +TEST_F(BitmapFunctionsTest, sub_bitmap) { + // normal + BitmapValue bitmap1({0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,100,200,500}); + StringVal bitmap_src = convert_bitmap_to_string(ctx, bitmap1); + + StringVal res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(30), BigIntVal(6)); + BitmapValue bitmap2({30,31,32,33,100,200}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap2)); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(30), BigIntVal(100)); + BitmapValue bitmap3({30,31,32,33,100,200,500}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap3)); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(30), BigIntVal(INT64_MAX)); + BitmapValue bitmap4({30,31,32,33,100,200,500}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap4)); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(0), BigIntVal(2)); + BitmapValue bitmap5({0,1}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap5)); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(-1), BigIntVal(2)); + BitmapValue bitmap6({500}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap6)); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(-7), BigIntVal(6)); + BitmapValue bitmap7({30,31,32,33,100,200}); + ASSERT_EQ(res, convert_bitmap_to_string(ctx, bitmap7)); + + // null + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(0), BigIntVal(0)); + ASSERT_TRUE(res.is_null); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(100), BigIntVal(6)); + ASSERT_TRUE(res.is_null); + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(-100), BigIntVal(6)); + ASSERT_TRUE(res.is_null); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(30), BigIntVal(INT64_MIN)); + ASSERT_TRUE(res.is_null); + + res = BitmapFunctions::sub_bitmap(ctx, StringVal::null(), BigIntVal(1), BigIntVal(3)); + ASSERT_TRUE(res.is_null); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal::null(), BigIntVal(20)); + ASSERT_TRUE(res.is_null); + + res = BitmapFunctions::sub_bitmap(ctx, bitmap_src, BigIntVal(10), BigIntVal::null()); + ASSERT_TRUE(res.is_null); + + // empty + BitmapValue bitmap0; + StringVal empty_str = convert_bitmap_to_string(ctx, bitmap0); + res = BitmapFunctions::sub_bitmap(ctx, empty_str, BigIntVal(0), BigIntVal(3)); + ASSERT_TRUE(res.is_null); } TEST_F(BitmapFunctionsTest, bitmap_subset_limit) { diff --git a/docs/.vuepress/sidebar/en.js b/docs/.vuepress/sidebar/en.js index e585509..89b2d8c 100644 --- a/docs/.vuepress/sidebar/en.js +++ b/docs/.vuepress/sidebar/en.js @@ -426,6 +426,7 @@ module.exports = [ "bitmap_and_not_count", "bitmap_subset_in_range", "bitmap_subset_limit", + "sub_bitmap", "bitmap_to_string", "bitmap_union", "bitmap_xor", diff --git a/docs/.vuepress/sidebar/zh-CN.js b/docs/.vuepress/sidebar/zh-CN.js index b393c2f..d0c53a1 100644 --- a/docs/.vuepress/sidebar/zh-CN.js +++ b/docs/.vuepress/sidebar/zh-CN.js @@ -430,6 +430,7 @@ module.exports = [ "bitmap_and_not_count", "bitmap_subset_in_range", "bitmap_subset_limit", + "sub_bitmap", "bitmap_to_string", "bitmap_union", "bitmap_xor", diff --git a/docs/en/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md b/docs/en/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md new file mode 100644 index 0000000..eb4aeae --- /dev/null +++ b/docs/en/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md @@ -0,0 +1,61 @@ +--- +{ + "title": "sub_bitmap", + "language": "en" +} +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +# sub_bitmap + +## description +### Syntax + +`BITMAP SUB_BITMAP(BITMAP src, BIGINT offset, BIGINT cardinality_limit)` + +Starting from the position specified by offset, intercept cardinality_limit bitmap elements and return a bitmap subset. + +## example + +``` +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), 0, 3)) value; ++-------+ +| value | ++-------+ +| 0,1,2 | ++-------+ + +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), -3, 2)) value; ++-------+ +| value | ++-------+ +| 2,3 | ++-------+ + +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), 2, 100)) value; ++-------+ +| value | ++-------+ +| 2,3,5 | ++-------+ +``` + +## keyword + + SUB_BITMAP,BITMAP_SUBSET,BITMAP diff --git a/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md b/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md new file mode 100644 index 0000000..2118250 --- /dev/null +++ b/docs/zh-CN/sql-reference/sql-functions/bitmap-functions/sub_bitmap.md @@ -0,0 +1,62 @@ +--- +{ + "title": "sub_bitmap", + "language": "zh-CN" +} +--- + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +--> + +# sub_bitmap + +## Description + +### Syntax + +`BITMAP SUB_BITMAP(BITMAP src, BIGINT offset, BIGINT cardinality_limit)` + +从 offset 指定位置开始,截取 cardinality_limit 个 bitmap 元素,返回一个 bitmap 子集。 + +## example + +``` +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), 0, 3)) value; ++-------+ +| value | ++-------+ +| 0,1,2 | ++-------+ + +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), -3, 2)) value; ++-------+ +| value | ++-------+ +| 2,3 | ++-------+ + +mysql> select bitmap_to_string(sub_bitmap(bitmap_from_string('1,0,1,2,3,1,5'), 2, 100)) value; ++-------+ +| value | ++-------+ +| 2,3,5 | ++-------+ +``` + +## keyword + + SUB_BITMAP,BITMAP_SUBSET,BITMAP \ No newline at end of file diff --git a/gensrc/script/doris_builtins_functions.py b/gensrc/script/doris_builtins_functions.py index 6c990b5..6c9fbbe 100755 --- a/gensrc/script/doris_builtins_functions.py +++ b/gensrc/script/doris_builtins_functions.py @@ -1229,6 +1229,10 @@ visible_functions = [ [['bitmap_or_count'], 'BIGINT', ['BITMAP','BITMAP'], '_ZN5doris15BitmapFunctions15bitmap_or_countEPN9doris_udf15FunctionContextERKNS1_9StringValES6_', '', '', '', ''], + [['sub_bitmap'], 'BITMAP', ['BITMAP', 'BIGINT', 'BIGINT'], + '_ZN5doris15BitmapFunctions10sub_bitmapEPN9doris_udf15FunctionContextERKNS1_9StringValERKNS1_9BigIntValES9_', + '', '', 'vec', ''], + # hash functions [['murmur_hash3_32'], 'INT', ['VARCHAR', '...'], '_ZN5doris13HashFunctions15murmur_hash3_32EPN9doris_udf15FunctionContextEiPKNS1_9StringValE', --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org