mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
added bitmapMin and bitmapMax
This commit is contained in:
parent
03014fe920
commit
460ccb04a2
@ -495,6 +495,48 @@ public:
|
||||
return count;
|
||||
}
|
||||
|
||||
UInt64 rb_min() const
|
||||
{
|
||||
UInt64 min_val = UINT32_MAX;
|
||||
if (isSmall())
|
||||
{
|
||||
for (const auto & x : small)
|
||||
{
|
||||
T val = x.getValue();
|
||||
if ((UInt64)val < min_val)
|
||||
{
|
||||
min_val = (UInt64)val;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
min_val = (UInt64)roaring_bitmap_minimum(rb);
|
||||
}
|
||||
return min_val;
|
||||
}
|
||||
|
||||
UInt64 rb_max() const
|
||||
{
|
||||
UInt64 max_val = 0;
|
||||
if (isSmall())
|
||||
{
|
||||
for (const auto & x : small)
|
||||
{
|
||||
T val = x.getValue();
|
||||
if ((UInt64)val > max_val)
|
||||
{
|
||||
max_val = (UInt64)val;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
max_val = (UInt64)roaring_bitmap_maximum(rb);
|
||||
}
|
||||
return max_val;
|
||||
}
|
||||
|
||||
private:
|
||||
/// To read and write the DB Buffer directly, migrate code from CRoaring
|
||||
void db_roaring_bitmap_add_many(DB::ReadBuffer & dbBuf, roaring_bitmap_t * r, size_t n_args)
|
||||
|
@ -12,6 +12,8 @@ void registerFunctionsBitmap(FunctionFactory & factory)
|
||||
factory.registerFunction<FunctionBitmapSubsetInRange>();
|
||||
|
||||
factory.registerFunction<FunctionBitmapSelfCardinality>();
|
||||
factory.registerFunction<FunctionBitmapMin>();
|
||||
factory.registerFunction<FunctionBitmapMax>();
|
||||
factory.registerFunction<FunctionBitmapAndCardinality>();
|
||||
factory.registerFunction<FunctionBitmapOrCardinality>();
|
||||
factory.registerFunction<FunctionBitmapXorCardinality>();
|
||||
|
@ -49,6 +49,12 @@ namespace ErrorCodes
|
||||
* Retrun bitmap cardinality:
|
||||
* bitmapCardinality: bitmap -> integer
|
||||
*
|
||||
* Retrun smallest value in the set:
|
||||
* bitmapMin: bitmap -> integer
|
||||
*
|
||||
* Retrun the greatest value in the set:
|
||||
* bitmapMax: bitmap -> integer
|
||||
*
|
||||
* Two bitmap and calculation, return cardinality:
|
||||
* bitmapAndCardinality: bitmap,bitmap -> integer
|
||||
*
|
||||
@ -357,13 +363,13 @@ private:
|
||||
}
|
||||
};
|
||||
|
||||
template <typename Name>
|
||||
template <typename Impl>
|
||||
class FunctionBitmapSelfCardinalityImpl : public IFunction
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = Name::name;
|
||||
static constexpr auto name = Impl::name;
|
||||
|
||||
static FunctionPtr create(const Context &) { return std::make_shared<FunctionBitmapSelfCardinalityImpl>(); }
|
||||
static FunctionPtr create(const Context &) { return std::make_shared<FunctionBitmapSelfCardinalityImpl<Impl>>(); }
|
||||
|
||||
String getName() const override { return name; }
|
||||
|
||||
@ -417,13 +423,46 @@ private:
|
||||
= typeid_cast<const ColumnAggregateFunction *>(block.getByPosition(arguments[0]).column.get());
|
||||
for (size_t i = 0; i < input_rows_count; ++i)
|
||||
{
|
||||
const AggregateFunctionGroupBitmapData<T> & bd1
|
||||
const AggregateFunctionGroupBitmapData<T> & bd
|
||||
= *reinterpret_cast<const AggregateFunctionGroupBitmapData<T> *>(column->getData()[i]);
|
||||
vec_to[i] = bd1.rbs.size();
|
||||
vec_to[i] = Impl::apply(bd);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
struct BitmapCardinalityImpl
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "bitmapCardinality";
|
||||
template <typename T>
|
||||
static UInt64 apply(const AggregateFunctionGroupBitmapData<T> & bd)
|
||||
{
|
||||
return bd.rbs.size();
|
||||
}
|
||||
};
|
||||
|
||||
struct BitmapMinImpl
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "bitmapMin";
|
||||
template <typename T>
|
||||
static UInt64 apply(const AggregateFunctionGroupBitmapData<T> & bd)
|
||||
{
|
||||
return bd.rbs.rb_min();
|
||||
}
|
||||
};
|
||||
|
||||
struct BitmapMaxImpl
|
||||
{
|
||||
public:
|
||||
static constexpr auto name = "bitmapMax";
|
||||
template <typename T>
|
||||
static UInt64 apply(const AggregateFunctionGroupBitmapData<T> & bd)
|
||||
{
|
||||
return bd.rbs.rb_max();
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
struct BitmapAndCardinalityImpl
|
||||
{
|
||||
@ -840,7 +879,9 @@ struct NameBitmapHasAny
|
||||
static constexpr auto name = "bitmapHasAny";
|
||||
};
|
||||
|
||||
using FunctionBitmapSelfCardinality = FunctionBitmapSelfCardinalityImpl<NameBitmapCardinality>;
|
||||
using FunctionBitmapSelfCardinality = FunctionBitmapSelfCardinalityImpl<BitmapCardinalityImpl>;
|
||||
using FunctionBitmapMin = FunctionBitmapSelfCardinalityImpl<BitmapMinImpl>;
|
||||
using FunctionBitmapMax = FunctionBitmapSelfCardinalityImpl<BitmapMaxImpl>;
|
||||
using FunctionBitmapAndCardinality = FunctionBitmapCardinality<BitmapAndCardinalityImpl, NameBitmapAndCardinality, UInt64>;
|
||||
using FunctionBitmapOrCardinality = FunctionBitmapCardinality<BitmapOrCardinalityImpl, NameBitmapOrCardinality, UInt64>;
|
||||
using FunctionBitmapXorCardinality = FunctionBitmapCardinality<BitmapXorCardinalityImpl, NameBitmapXorCardinality, UInt64>;
|
||||
|
@ -67,3 +67,13 @@
|
||||
[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]
|
||||
[30,31,32,33,100]
|
||||
[100]
|
||||
4294967295
|
||||
4294967295
|
||||
4294967295
|
||||
1
|
||||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
9
|
||||
500
|
||||
|
@ -211,3 +211,27 @@ select bitmapToArray(bitmapSubsetInRange(bitmapBuild([
|
||||
select bitmapToArray(bitmapSubsetInRange(bitmapBuild([
|
||||
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]), toUInt32(100), toUInt32(200)));
|
||||
|
||||
-- bitmapMin:
|
||||
---- Empty
|
||||
SELECT bitmapMin(bitmapBuild(emptyArrayUInt8()));
|
||||
SELECT bitmapMin(bitmapBuild(emptyArrayUInt16()));
|
||||
SELECT bitmapMin(bitmapBuild(emptyArrayUInt32()));
|
||||
---- Small
|
||||
select bitmapMin(bitmapBuild([1,5,7,9]));
|
||||
---- Large
|
||||
select bitmapMin(bitmapBuild([
|
||||
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]));
|
||||
|
||||
-- bitmapMax:
|
||||
---- Empty
|
||||
SELECT bitmapMax(bitmapBuild(emptyArrayUInt8()));
|
||||
SELECT bitmapMax(bitmapBuild(emptyArrayUInt16()));
|
||||
SELECT bitmapMax(bitmapBuild(emptyArrayUInt32()));
|
||||
---- Small
|
||||
select bitmapMax(bitmapBuild([1,5,7,9]));
|
||||
---- Large
|
||||
select bitmapMax(bitmapBuild([
|
||||
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]));
|
||||
|
@ -292,6 +292,56 @@ SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapMin
|
||||
|
||||
Retrun smallest value of type UInt64 in the set, UINT32_MAX if the set is empty.
|
||||
|
||||
|
||||
```
|
||||
bitmapMin(bitmap)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `bitmap` – bitmap object.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapMax
|
||||
|
||||
Retrun smallest value of type UInt64 in the set, 0 if the set is empty.
|
||||
|
||||
|
||||
```
|
||||
bitmapMax(bitmap)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `bitmap` – bitmap object.
|
||||
|
||||
**Example**
|
||||
|
||||
``` sql
|
||||
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
┌─res─┐
|
||||
│ 5 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapAndCardinality
|
||||
|
||||
Two bitmap and calculation, return cardinality of type UInt64.
|
||||
|
@ -276,6 +276,54 @@ SELECT bitmapCardinality(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapMin
|
||||
|
||||
返回一个UInt64类型的数值,表示位图中的最小值。如果位图为空则返回UINT32_MAX。
|
||||
|
||||
```
|
||||
bitmapMin(bitmap)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `bitmap` – 位图对象。
|
||||
|
||||
**示例**
|
||||
|
||||
``` sql
|
||||
SELECT bitmapMin(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
┌─res─┐
|
||||
│ 1 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapMax
|
||||
|
||||
返回一个UInt64类型的数值,表示位图中的最大值。如果位图为空则返回0。
|
||||
|
||||
```
|
||||
bitmapMax(bitmap)
|
||||
```
|
||||
|
||||
**Parameters**
|
||||
|
||||
- `bitmap` – 位图对象。
|
||||
|
||||
**示例**
|
||||
|
||||
``` sql
|
||||
SELECT bitmapMax(bitmapBuild([1, 2, 3, 4, 5])) AS res
|
||||
```
|
||||
|
||||
```
|
||||
┌─res─┐
|
||||
│ 5 │
|
||||
└─────┘
|
||||
```
|
||||
|
||||
## bitmapAndCardinality
|
||||
|
||||
为两个位图对象进行与操作,返回结果位图的基数。
|
||||
|
Loading…
Reference in New Issue
Block a user