Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
f21c4c89
C
ClickHouse
项目概览
2dot5
/
ClickHouse
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
ClickHouse
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f21c4c89
编写于
10月 08, 2018
作者:
C
chertus
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Decimal dictionaries support [CLICKHOUSE-4045]
上级
bff05fa7
变更
26
显示空白变更内容
内联
并排
Showing
26 changed file
with
533 addition
and
68 deletion
+533
-68
dbms/src/Columns/ColumnDecimal.cpp
dbms/src/Columns/ColumnDecimal.cpp
+7
-1
dbms/src/Columns/ColumnDecimal.h
dbms/src/Columns/ColumnDecimal.h
+1
-0
dbms/src/Dictionaries/CacheDictionary.cpp
dbms/src/Dictionaries/CacheDictionary.cpp
+48
-6
dbms/src/Dictionaries/CacheDictionary.h
dbms/src/Dictionaries/CacheDictionary.h
+20
-6
dbms/src/Dictionaries/ComplexKeyCacheDictionary.h
dbms/src/Dictionaries/ComplexKeyCacheDictionary.h
+25
-4
dbms/src/Dictionaries/ComplexKeyCacheDictionary_createAttributeWithType.cpp
...ies/ComplexKeyCacheDictionary_createAttributeWithType.cpp
+15
-0
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate1.cpp
.../src/Dictionaries/ComplexKeyCacheDictionary_generate1.cpp
+4
-1
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate2.cpp
.../src/Dictionaries/ComplexKeyCacheDictionary_generate2.cpp
+4
-1
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate3.cpp
.../src/Dictionaries/ComplexKeyCacheDictionary_generate3.cpp
+4
-1
dbms/src/Dictionaries/ComplexKeyCacheDictionary_setAttributeValue.cpp
...tionaries/ComplexKeyCacheDictionary_setAttributeValue.cpp
+5
-0
dbms/src/Dictionaries/ComplexKeyCacheDictionary_setDefaultAttributeValue.cpp
...es/ComplexKeyCacheDictionary_setDefaultAttributeValue.cpp
+11
-0
dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp
dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp
+38
-3
dbms/src/Dictionaries/ComplexKeyHashedDictionary.h
dbms/src/Dictionaries/ComplexKeyHashedDictionary.h
+18
-3
dbms/src/Dictionaries/DictionaryBlockInputStream.h
dbms/src/Dictionaries/DictionaryBlockInputStream.h
+82
-12
dbms/src/Dictionaries/DictionaryStructure.cpp
dbms/src/Dictionaries/DictionaryStructure.cpp
+14
-0
dbms/src/Dictionaries/DictionaryStructure.h
dbms/src/Dictionaries/DictionaryStructure.h
+3
-0
dbms/src/Dictionaries/FlatDictionary.cpp
dbms/src/Dictionaries/FlatDictionary.cpp
+32
-4
dbms/src/Dictionaries/FlatDictionary.h
dbms/src/Dictionaries/FlatDictionary.h
+18
-3
dbms/src/Dictionaries/HashedDictionary.cpp
dbms/src/Dictionaries/HashedDictionary.cpp
+38
-3
dbms/src/Dictionaries/HashedDictionary.h
dbms/src/Dictionaries/HashedDictionary.h
+18
-3
dbms/src/Dictionaries/MongoDBDictionarySource.cpp
dbms/src/Dictionaries/MongoDBDictionarySource.cpp
+3
-0
dbms/src/Dictionaries/RangeDictionaryBlockInputStream.h
dbms/src/Dictionaries/RangeDictionaryBlockInputStream.h
+30
-8
dbms/src/Dictionaries/RangeHashedDictionary.cpp
dbms/src/Dictionaries/RangeHashedDictionary.cpp
+33
-2
dbms/src/Dictionaries/RangeHashedDictionary.h
dbms/src/Dictionaries/RangeHashedDictionary.h
+10
-1
dbms/src/Dictionaries/TrieDictionary.cpp
dbms/src/Dictionaries/TrieDictionary.cpp
+34
-3
dbms/src/Dictionaries/TrieDictionary.h
dbms/src/Dictionaries/TrieDictionary.h
+18
-3
未找到文件。
dbms/src/Columns/ColumnDecimal.cpp
浏览文件 @
f21c4c89
//#include <cstring>
#include <cmath>
#include <ext/bit_cast.h>
#include <Common/Exception.h>
#include <Common/Arena.h>
...
...
@@ -47,6 +47,12 @@ const char * ColumnDecimal<T>::deserializeAndInsertFromArena(const char * pos)
return
pos
+
sizeof
(
T
);
}
template
<
typename
T
>
UInt64
ColumnDecimal
<
T
>::
get64
(
size_t
n
)
const
{
return
ext
::
bit_cast
<
UInt64
>
(
data
[
n
]);
}
template
<
typename
T
>
void
ColumnDecimal
<
T
>::
updateHashWithValue
(
size_t
n
,
SipHash
&
hash
)
const
{
...
...
dbms/src/Columns/ColumnDecimal.h
浏览文件 @
f21c4c89
...
...
@@ -111,6 +111,7 @@ public:
void
get
(
size_t
n
,
Field
&
res
)
const
override
{
res
=
(
*
this
)[
n
];
}
bool
getBool
(
size_t
n
)
const
override
{
return
bool
(
data
[
n
]);
}
Int64
getInt
(
size_t
n
)
const
override
{
return
Int64
(
data
[
n
]
*
scale
);
}
UInt64
get64
(
size_t
n
)
const
override
;
ColumnPtr
filter
(
const
IColumn
::
Filter
&
filt
,
ssize_t
result_size_hint
)
const
override
;
ColumnPtr
permute
(
const
IColumn
::
Permutation
&
perm
,
size_t
limit
)
const
override
;
...
...
dbms/src/Dictionaries/CacheDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -2,7 +2,6 @@
#include <sstream>
#include <memory>
#include <Columns/ColumnsNumber.h>
#include <Columns/ColumnVector.h>
#include <Columns/ColumnString.h>
#include <Common/BitHelpers.h>
#include <Common/randomSeed.h>
...
...
@@ -209,7 +208,7 @@ void CacheDictionary::isInConstantVector(
#define DECLARE(TYPE)\
void CacheDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const\
void CacheDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const\
{\
auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -230,6 +229,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
CacheDictionary
::
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
...
...
@@ -246,7 +248,7 @@ void CacheDictionary::getString(const std::string & attribute_name, const Padded
#define DECLARE(TYPE)\
void CacheDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -265,6 +267,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
CacheDictionary
::
getString
(
...
...
@@ -280,7 +285,7 @@ void CacheDictionary::getString(
#define DECLARE(TYPE)\
void CacheDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def,
PaddedPODArray
<TYPE> & out) const\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def,
ResultArrayType
<TYPE> & out) const\
{\
auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -299,6 +304,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
CacheDictionary
::
getString
(
...
...
@@ -491,6 +499,21 @@ CacheDictionary::Attribute CacheDictionary::createAttributeWithType(const Attrib
std
::
get
<
ContainerPtrType
<
Int64
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Int64
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Int64
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
Decimal32
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal32
>
();
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal32
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal32
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
Decimal64
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal64
>
();
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal64
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal64
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
Decimal128
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal128
>
();
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal128
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal128
);
break
;
case
AttributeUnderlyingType
::
Float32
:
std
::
get
<
Float32
>
(
attr
.
null_values
)
=
null_value
.
get
<
Float64
>
();
std
::
get
<
ContainerPtrType
<
Float32
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Float32
>>
(
size
);
...
...
@@ -518,7 +541,7 @@ template <typename OutputType, typename DefaultGetter>
void
CacheDictionary
::
getItemsNumber
(
Attribute
&
attribute
,
const
PaddedPODArray
<
Key
>
&
ids
,
PaddedPODArray
<
OutputType
>
&
out
,
ResultArrayType
<
OutputType
>
&
out
,
DefaultGetter
&&
get_default
)
const
{
if
(
false
)
{}
...
...
@@ -536,6 +559,9 @@ void CacheDictionary::getItemsNumber(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -545,7 +571,7 @@ template <typename AttributeType, typename OutputType, typename DefaultGetter>
void
CacheDictionary
::
getItemsNumberImpl
(
Attribute
&
attribute
,
const
PaddedPODArray
<
Key
>
&
ids
,
PaddedPODArray
<
OutputType
>
&
out
,
ResultArrayType
<
OutputType
>
&
out
,
DefaultGetter
&&
get_default
)
const
{
/// Mapping: <id> -> { all indices `i` of `ids` such that `ids[i]` = <id> }
...
...
@@ -893,6 +919,17 @@ void CacheDictionary::setDefaultAttributeValue(Attribute & attribute, const Key
case
AttributeUnderlyingType
::
Int64
:
std
::
get
<
ContainerPtrType
<
Int64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Int64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Float32
:
std
::
get
<
ContainerPtrType
<
Float32
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Float32
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Float64
:
std
::
get
<
ContainerPtrType
<
Float64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Float64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal32
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal128
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
String
:
{
const
auto
&
null_value_ref
=
std
::
get
<
String
>
(
attribute
.
null_values
);
...
...
@@ -926,6 +963,11 @@ void CacheDictionary::setAttributeValue(Attribute & attribute, const Key idx, co
case
AttributeUnderlyingType
::
Int64
:
std
::
get
<
ContainerPtrType
<
Int64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Int64
>
();
break
;
case
AttributeUnderlyingType
::
Float32
:
std
::
get
<
ContainerPtrType
<
Float32
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Float64
>
();
break
;
case
AttributeUnderlyingType
::
Float64
:
std
::
get
<
ContainerPtrType
<
Float64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Float64
>
();
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal32
>
();
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal64
>
();
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal128
>
();
break
;
case
AttributeUnderlyingType
::
String
:
{
const
auto
&
string
=
value
.
get
<
String
>
();
...
...
dbms/src/Dictionaries/CacheDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -5,6 +5,7 @@
#include <Dictionaries/DictionaryStructure.h>
#include <Common/ArenaWithFreeLists.h>
#include <Common/CurrentMetrics.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <ext/bit_cast.h>
#include <cmath>
...
...
@@ -80,8 +81,11 @@ public:
void
isInVectorConstant
(
const
PaddedPODArray
<
Key
>
&
child_ids
,
const
Key
ancestor_id
,
PaddedPODArray
<
UInt8
>
&
out
)
const
override
;
void
isInConstantVector
(
const
Key
child_id
,
const
PaddedPODArray
<
Key
>
&
ancestor_ids
,
PaddedPODArray
<
UInt8
>
&
out
)
const
override
;
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE(TYPE)\
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const;
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -93,6 +97,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
;
...
...
@@ -100,7 +107,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -112,6 +119,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -119,8 +129,7 @@ public:
ColumnString
*
const
out
)
const
;
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def, PaddedPODArray<TYPE> & out) const;
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def, ResultArrayType<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -132,6 +141,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -174,12 +186,14 @@ private:
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
ContainerPtrType
<
UInt8
>
,
ContainerPtrType
<
UInt16
>
,
ContainerPtrType
<
UInt32
>
,
ContainerPtrType
<
UInt64
>
,
ContainerPtrType
<
UInt128
>
,
ContainerPtrType
<
Int8
>
,
ContainerPtrType
<
Int16
>
,
ContainerPtrType
<
Int32
>
,
ContainerPtrType
<
Int64
>
,
ContainerPtrType
<
Decimal32
>
,
ContainerPtrType
<
Decimal64
>
,
ContainerPtrType
<
Decimal128
>
,
ContainerPtrType
<
Float32
>
,
ContainerPtrType
<
Float64
>
,
ContainerPtrType
<
StringRef
>>
arrays
;
};
...
...
@@ -193,14 +207,14 @@ private:
void
getItemsNumber
(
Attribute
&
attribute
,
const
PaddedPODArray
<
Key
>
&
ids
,
PaddedPODArray
<
OutputType
>
&
out
,
ResultArrayType
<
OutputType
>
&
out
,
DefaultGetter
&&
get_default
)
const
;
template
<
typename
AttributeType
,
typename
OutputType
,
typename
DefaultGetter
>
void
getItemsNumberImpl
(
Attribute
&
attribute
,
const
PaddedPODArray
<
Key
>
&
ids
,
PaddedPODArray
<
OutputType
>
&
out
,
ResultArrayType
<
OutputType
>
&
out
,
DefaultGetter
&&
get_default
)
const
;
template
<
typename
DefaultGetter
>
...
...
dbms/src/Dictionaries/ComplexKeyCacheDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -6,6 +6,7 @@
#include <tuple>
#include <vector>
#include <shared_mutex>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <Common/ArenaWithFreeLists.h>
#include <Common/HashTable/HashMap.h>
...
...
@@ -128,11 +129,14 @@ public:
return
dict_struct
.
attributes
[
&
getAttribute
(
attribute_name
)
-
attributes
.
data
()].
injective
;
}
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
/// In all functions below, key_columns must be full (non-constant) columns.
/// See the requirement in IDataType.h for text-serialization functions.
#define DECLARE(TYPE) \
void get##TYPE( \
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,
PaddedPODArray
<TYPE> & out) const;
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -144,6 +148,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
const
Columns
&
key_columns
,
const
DataTypes
&
key_types
,
ColumnString
*
out
)
const
;
...
...
@@ -153,7 +160,7 @@ public:
const Columns & key_columns, \
const DataTypes & key_types, \
const PaddedPODArray<TYPE> & def, \
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -165,6 +172,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
...
...
@@ -178,7 +188,7 @@ public:
const Columns & key_columns, \
const DataTypes & key_types, \
const TYPE def, \
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -190,6 +200,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
...
...
@@ -247,7 +260,9 @@ private:
struct
Attribute
final
{
AttributeUnderlyingType
type
;
std
::
tuple
<
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
ContainerPtrType
<
UInt8
>
,
ContainerPtrType
<
UInt16
>
,
ContainerPtrType
<
UInt32
>
,
...
...
@@ -257,6 +272,9 @@ private:
ContainerPtrType
<
Int16
>
,
ContainerPtrType
<
Int32
>
,
ContainerPtrType
<
Int64
>
,
ContainerPtrType
<
Decimal32
>
,
ContainerPtrType
<
Decimal64
>
,
ContainerPtrType
<
Decimal128
>
,
ContainerPtrType
<
Float32
>
,
ContainerPtrType
<
Float64
>
,
ContainerPtrType
<
StringRef
>>
...
...
@@ -288,6 +306,9 @@ private:
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
}
...
...
dbms/src/Dictionaries/ComplexKeyCacheDictionary_createAttributeWithType.cpp
浏览文件 @
f21c4c89
...
...
@@ -64,6 +64,21 @@ ComplexKeyCacheDictionary::Attribute ComplexKeyCacheDictionary::createAttributeW
std
::
get
<
ContainerPtrType
<
Float64
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Float64
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Float64
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
Decimal32
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal32
>
();
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal32
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal32
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
Decimal64
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal64
>
();
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal64
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal64
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
Decimal128
>
(
attr
.
null_values
)
=
null_value
.
get
<
Decimal128
>
();
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
Decimal128
>>
(
size
);
bytes_allocated
+=
size
*
sizeof
(
Decimal128
);
break
;
case
AttributeUnderlyingType
::
String
:
std
::
get
<
String
>
(
attr
.
null_values
)
=
null_value
.
get
<
String
>
();
std
::
get
<
ContainerPtrType
<
StringRef
>>
(
attr
.
arrays
)
=
std
::
make_unique
<
ContainerType
<
StringRef
>>
(
size
);
...
...
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate1.cpp
浏览文件 @
f21c4c89
...
...
@@ -9,7 +9,7 @@ namespace ErrorCodes
#define DECLARE(TYPE) \
void ComplexKeyCacheDictionary::get##TYPE( \
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,
PaddedPODArray
<TYPE> & out) const \
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,
ResultArrayType
<TYPE> & out) const \
{ \
dict_struct.validateKeyTypes(key_types); \
\
...
...
@@ -33,5 +33,8 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
}
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate2.cpp
浏览文件 @
f21c4c89
...
...
@@ -12,7 +12,7 @@ namespace ErrorCodes
const Columns & key_columns, \
const DataTypes & key_types, \
const PaddedPODArray<TYPE> & def, \
PaddedPODArray
<TYPE> & out) const \
ResultArrayType
<TYPE> & out) const \
{ \
dict_struct.validateKeyTypes(key_types); \
\
...
...
@@ -34,5 +34,8 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
}
dbms/src/Dictionaries/ComplexKeyCacheDictionary_generate3.cpp
浏览文件 @
f21c4c89
...
...
@@ -12,7 +12,7 @@ namespace ErrorCodes
const Columns & key_columns, \
const DataTypes & key_types, \
const TYPE def, \
PaddedPODArray
<TYPE> & out) const \
ResultArrayType
<TYPE> & out) const \
{ \
dict_struct.validateKeyTypes(key_types); \
\
...
...
@@ -34,5 +34,8 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
}
dbms/src/Dictionaries/ComplexKeyCacheDictionary_setAttributeValue.cpp
浏览文件 @
f21c4c89
...
...
@@ -18,6 +18,11 @@ void ComplexKeyCacheDictionary::setAttributeValue(Attribute & attribute, const s
case
AttributeUnderlyingType
::
Int64
:
std
::
get
<
ContainerPtrType
<
Int64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Int64
>
();
break
;
case
AttributeUnderlyingType
::
Float32
:
std
::
get
<
ContainerPtrType
<
Float32
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Float64
>
();
break
;
case
AttributeUnderlyingType
::
Float64
:
std
::
get
<
ContainerPtrType
<
Float64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Float64
>
();
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal32
>
();
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal64
>
();
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attribute
.
arrays
)[
idx
]
=
value
.
get
<
Decimal128
>
();
break
;
case
AttributeUnderlyingType
::
String
:
{
const
auto
&
string
=
value
.
get
<
String
>
();
...
...
dbms/src/Dictionaries/ComplexKeyCacheDictionary_setDefaultAttributeValue.cpp
浏览文件 @
f21c4c89
...
...
@@ -18,6 +18,17 @@ void ComplexKeyCacheDictionary::setDefaultAttributeValue(Attribute & attribute,
case
AttributeUnderlyingType
::
Int64
:
std
::
get
<
ContainerPtrType
<
Int64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Int64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Float32
:
std
::
get
<
ContainerPtrType
<
Float32
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Float32
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Float64
:
std
::
get
<
ContainerPtrType
<
Float64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Float64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
std
::
get
<
ContainerPtrType
<
Decimal32
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal32
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
std
::
get
<
ContainerPtrType
<
Decimal64
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal64
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
std
::
get
<
ContainerPtrType
<
Decimal128
>>
(
attribute
.
arrays
)[
idx
]
=
std
::
get
<
Decimal128
>
(
attribute
.
null_values
);
break
;
case
AttributeUnderlyingType
::
String
:
{
const
auto
&
null_value_ref
=
std
::
get
<
String
>
(
attribute
.
null_values
);
...
...
dbms/src/Dictionaries/ComplexKeyHashedDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -45,7 +45,7 @@ ComplexKeyHashedDictionary::ComplexKeyHashedDictionary(const ComplexKeyHashedDic
#define DECLARE(TYPE)\
void ComplexKeyHashedDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
dict_struct.validateKeyTypes(key_types);\
\
...
...
@@ -70,6 +70,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
ComplexKeyHashedDictionary
::
getString
(
...
...
@@ -92,7 +95,7 @@ void ComplexKeyHashedDictionary::getString(
#define DECLARE(TYPE)\
void ComplexKeyHashedDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const PaddedPODArray<TYPE> & def,
PaddedPODArray
<TYPE> & out) const\
const PaddedPODArray<TYPE> & def,
ResultArrayType
<TYPE> & out) const\
{\
dict_struct.validateKeyTypes(key_types);\
\
...
...
@@ -115,6 +118,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
ComplexKeyHashedDictionary
::
getString
(
...
...
@@ -135,7 +141,7 @@ void ComplexKeyHashedDictionary::getString(
#define DECLARE(TYPE)\
void ComplexKeyHashedDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const TYPE def,
PaddedPODArray
<TYPE> & out) const\
const TYPE def,
ResultArrayType
<TYPE> & out) const\
{\
dict_struct.validateKeyTypes(key_types);\
\
...
...
@@ -158,6 +164,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
ComplexKeyHashedDictionary
::
getString
(
...
...
@@ -195,6 +204,10 @@ void ComplexKeyHashedDictionary::has(const Columns & key_columns, const DataType
case
AttributeUnderlyingType
::
Float32
:
has
<
Float32
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Float64
:
has
<
Float64
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
String
:
has
<
StringRef
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
has
<
Decimal32
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
has
<
Decimal64
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
has
<
Decimal128
>
(
attribute
,
key_columns
,
out
);
break
;
}
}
...
...
@@ -387,6 +400,11 @@ void ComplexKeyHashedDictionary::calculateBytesAllocated()
case
AttributeUnderlyingType
::
Int64
:
addAttributeSize
<
Int64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float32
:
addAttributeSize
<
Float32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float64
:
addAttributeSize
<
Float64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
addAttributeSize
<
Decimal32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
addAttributeSize
<
Decimal64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
addAttributeSize
<
Decimal128
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
String
:
{
addAttributeSize
<
StringRef
>
(
attribute
);
...
...
@@ -424,6 +442,11 @@ ComplexKeyHashedDictionary::Attribute ComplexKeyHashedDictionary::createAttribut
case
AttributeUnderlyingType
::
Int64
:
createAttributeImpl
<
Int64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float32
:
createAttributeImpl
<
Float32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float64
:
createAttributeImpl
<
Float64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
createAttributeImpl
<
Decimal32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
createAttributeImpl
<
Decimal64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
createAttributeImpl
<
Decimal128
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
String
:
{
std
::
get
<
String
>
(
attr
.
null_values
)
=
null_value
.
get
<
String
>
();
...
...
@@ -459,6 +482,9 @@ void ComplexKeyHashedDictionary::getItemsNumber(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -517,6 +543,11 @@ bool ComplexKeyHashedDictionary::setAttributeValue(Attribute & attribute, const
case
AttributeUnderlyingType
::
Int64
:
return
setAttributeValueImpl
<
Int64
>
(
attribute
,
key
,
value
.
get
<
Int64
>
());
case
AttributeUnderlyingType
::
Float32
:
return
setAttributeValueImpl
<
Float32
>
(
attribute
,
key
,
value
.
get
<
Float64
>
());
case
AttributeUnderlyingType
::
Float64
:
return
setAttributeValueImpl
<
Float64
>
(
attribute
,
key
,
value
.
get
<
Float64
>
());
case
AttributeUnderlyingType
::
Decimal32
:
return
setAttributeValueImpl
<
Decimal32
>
(
attribute
,
key
,
value
.
get
<
Decimal32
>
());
case
AttributeUnderlyingType
::
Decimal64
:
return
setAttributeValueImpl
<
Decimal64
>
(
attribute
,
key
,
value
.
get
<
Decimal64
>
());
case
AttributeUnderlyingType
::
Decimal128
:
return
setAttributeValueImpl
<
Decimal128
>
(
attribute
,
key
,
value
.
get
<
Decimal128
>
());
case
AttributeUnderlyingType
::
String
:
{
auto
&
map
=
*
std
::
get
<
ContainerPtrType
<
StringRef
>>
(
attribute
.
maps
);
...
...
@@ -604,6 +635,10 @@ std::vector<StringRef> ComplexKeyHashedDictionary::getKeys() const
case
AttributeUnderlyingType
::
Float32
:
return
getKeys
<
Float32
>
(
attribute
);
case
AttributeUnderlyingType
::
Float64
:
return
getKeys
<
Float64
>
(
attribute
);
case
AttributeUnderlyingType
::
String
:
return
getKeys
<
StringRef
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal32
:
return
getKeys
<
Decimal32
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal64
:
return
getKeys
<
Decimal64
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal128
:
return
getKeys
<
Decimal128
>
(
attribute
);
}
return
{};
}
...
...
dbms/src/Dictionaries/ComplexKeyHashedDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -5,6 +5,7 @@
#include <Dictionaries/DictionaryStructure.h>
#include <common/StringRef.h>
#include <Common/HashTable/HashMap.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <Common/Arena.h>
#include <ext/range.h>
...
...
@@ -65,10 +66,13 @@ public:
return
dict_struct
.
attributes
[
&
getAttribute
(
attribute_name
)
-
attributes
.
data
()].
injective
;
}
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -80,6 +84,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -89,7 +96,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const PaddedPODArray<TYPE> & def,
PaddedPODArray
<TYPE> & out) const;
const PaddedPODArray<TYPE> & def,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -101,6 +108,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -110,7 +120,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const TYPE def,
PaddedPODArray
<TYPE> & out) const;
const TYPE def,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -122,6 +132,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -143,12 +156,14 @@ private:
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
ContainerPtrType
<
UInt8
>
,
ContainerPtrType
<
UInt16
>
,
ContainerPtrType
<
UInt32
>
,
ContainerPtrType
<
UInt64
>
,
ContainerPtrType
<
UInt128
>
,
ContainerPtrType
<
Int8
>
,
ContainerPtrType
<
Int16
>
,
ContainerPtrType
<
Int32
>
,
ContainerPtrType
<
Int64
>
,
ContainerPtrType
<
Decimal32
>
,
ContainerPtrType
<
Decimal64
>
,
ContainerPtrType
<
Decimal128
>
,
ContainerPtrType
<
Float32
>
,
ContainerPtrType
<
Float64
>
,
ContainerPtrType
<
StringRef
>>
maps
;
std
::
unique_ptr
<
Arena
>
string_arena
;
...
...
dbms/src/Dictionaries/DictionaryBlockInputStream.h
浏览文件 @
f21c4c89
#pragma once
#include <Columns/ColumnVector.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <Columns/IColumn.h>
#include <DataStreams/IProfilingBlockInputStream.h>
...
...
@@ -63,12 +64,20 @@ private:
template
<
typename
Type
>
using
DictionaryGetter
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
PaddedPODArray
<
Key
>
&
,
PaddedPODArray
<
Type
>
&
)
const
;
template
<
typename
Type
>
using
DictionaryDecimalGetter
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
PaddedPODArray
<
Key
>
&
,
DecimalPaddedPODArray
<
Type
>
&
)
const
;
using
DictionaryStringGetter
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
PaddedPODArray
<
Key
>
&
,
ColumnString
*
)
const
;
// for complex complex key dictionaries
template
<
typename
Type
>
using
GetterByKey
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
Columns
&
,
const
DataTypes
&
,
PaddedPODArray
<
Type
>
&
out
)
const
;
template
<
typename
Type
>
using
DecimalGetterByKey
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
Columns
&
,
const
DataTypes
&
,
DecimalPaddedPODArray
<
Type
>
&
out
)
const
;
using
StringGetterByKey
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
Columns
&
,
const
DataTypes
&
,
ColumnString
*
out
)
const
;
// call getXXX
...
...
@@ -78,6 +87,11 @@ private:
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dictionary
)
const
;
template
<
typename
Type
,
typename
Container
>
void
callGetter
(
DictionaryDecimalGetter
<
Type
>
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dictionary
)
const
;
template
<
typename
Container
>
void
callGetter
(
DictionaryStringGetter
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
...
...
@@ -89,12 +103,17 @@ private:
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dictionary
)
const
;
template
<
typename
Type
,
typename
Container
>
void
callGetter
(
DecimalGetterByKey
<
Type
>
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dictionary
)
const
;
template
<
typename
Container
>
void
callGetter
(
StringGetterByKey
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dictionary
)
const
;
template
<
template
<
typename
>
class
Getter
,
typename
StringGetter
>
template
<
template
<
typename
>
class
Getter
,
t
emplate
<
typename
>
class
DecimalGetter
,
t
ypename
StringGetter
>
Block
fillBlock
(
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
types
,
ColumnsWithTypeAndName
&&
view
)
const
;
...
...
@@ -147,7 +166,8 @@ DictionaryBlockInputStream<DictionaryType, Key>::DictionaryBlockInputStream(
dictionary
(
std
::
static_pointer_cast
<
const
DictionaryType
>
(
dictionary
)),
column_names
(
column_names
),
ids
(
std
::
move
(
ids
)),
logger
(
&
Poco
::
Logger
::
get
(
"DictionaryBlockInputStream"
)),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
DictionaryGetter
,
DictionaryStringGetter
>
),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
DictionaryGetter
,
DictionaryDecimalGetter
,
DictionaryStringGetter
>
),
key_type
(
DictionaryKeyType
::
Id
)
{
}
...
...
@@ -159,7 +179,7 @@ DictionaryBlockInputStream<DictionaryType, Key>::DictionaryBlockInputStream(
:
DictionaryBlockInputStreamBase
(
keys
.
size
(),
max_block_size
),
dictionary
(
std
::
static_pointer_cast
<
const
DictionaryType
>
(
dictionary
)),
column_names
(
column_names
),
logger
(
&
Poco
::
Logger
::
get
(
"DictionaryBlockInputStream"
)),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
GetterByKey
,
StringGetterByKey
>
),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
GetterByKey
,
DecimalGetterByKey
,
StringGetterByKey
>
),
key_type
(
DictionaryKeyType
::
ComplexKey
)
{
const
DictionaryStructure
&
dictionaty_structure
=
dictionary
->
getStructure
();
...
...
@@ -175,7 +195,7 @@ DictionaryBlockInputStream<DictionaryType, Key>::DictionaryBlockInputStream(
:
DictionaryBlockInputStreamBase
(
data_columns
.
front
()
->
size
(),
max_block_size
),
dictionary
(
std
::
static_pointer_cast
<
const
DictionaryType
>
(
dictionary
)),
column_names
(
column_names
),
logger
(
&
Poco
::
Logger
::
get
(
"DictionaryBlockInputStream"
)),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
GetterByKey
,
StringGetterByKey
>
),
fill_block_function
(
&
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
<
GetterByKey
,
DecimalGetterByKey
,
StringGetterByKey
>
),
data_columns
(
data_columns
),
get_key_columns_function
(
get_key_columns_function
),
get_view_columns_function
(
get_view_columns_function
),
key_type
(
DictionaryKeyType
::
Callback
)
...
...
@@ -243,6 +263,16 @@ void DictionaryBlockInputStream<DictionaryType, Key>::callGetter(
(
dict
.
*
getter
)(
attribute
.
name
,
ids_to_fill
,
container
);
}
template
<
typename
DictionaryType
,
typename
Key
>
template
<
typename
Type
,
typename
Container
>
void
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
callGetter
(
DictionaryDecimalGetter
<
Type
>
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
/*keys*/
,
const
DataTypes
&
/*data_types*/
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dict
)
const
{
(
dict
.
*
getter
)(
attribute
.
name
,
ids_to_fill
,
container
);
}
template
<
typename
DictionaryType
,
typename
Key
>
template
<
typename
Container
>
void
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
callGetter
(
...
...
@@ -263,6 +293,16 @@ void DictionaryBlockInputStream<DictionaryType, Key>::callGetter(
(
dict
.
*
getter
)(
attribute
.
name
,
keys
,
data_types
,
container
);
}
template
<
typename
DictionaryType
,
typename
Key
>
template
<
typename
Type
,
typename
Container
>
void
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
callGetter
(
DecimalGetterByKey
<
Type
>
getter
,
const
PaddedPODArray
<
Key
>
&
/*ids_to_fill*/
,
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
Container
&
container
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dict
)
const
{
(
dict
.
*
getter
)(
attribute
.
name
,
keys
,
data_types
,
container
);
}
template
<
typename
DictionaryType
,
typename
Key
>
template
<
typename
Container
>
void
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
callGetter
(
...
...
@@ -275,7 +315,7 @@ void DictionaryBlockInputStream<DictionaryType, Key>::callGetter(
template
<
typename
DictionaryType
,
typename
Key
>
template
<
template
<
typename
>
class
Getter
,
typename
StringGetter
>
template
<
template
<
typename
>
class
Getter
,
t
emplate
<
typename
>
class
DecimalGetter
,
t
ypename
StringGetter
>
Block
DictionaryBlockInputStream
<
DictionaryType
,
Key
>::
fillBlock
(
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
Columns
&
keys
,
const
DataTypes
&
types
,
ColumnsWithTypeAndName
&&
view
)
const
{
...
...
@@ -343,6 +383,24 @@ Block DictionaryBlockInputStream<DictionaryType, Key>::fillBlock(
case
AttributeUnderlyingType
::
Float64
:
GET_COLUMN_FORM_ATTRIBUTE
(
Float64
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
{
column
=
getColumnFromAttribute
<
Decimal32
,
DecimalGetter
<
Decimal32
>>
(
&
DictionaryType
::
getDecimal32
,
ids_to_fill
,
keys
,
data_types
,
attribute
,
*
dictionary
);
break
;
}
case
AttributeUnderlyingType
::
Decimal64
:
{
column
=
getColumnFromAttribute
<
Decimal64
,
DecimalGetter
<
Decimal64
>>
(
&
DictionaryType
::
getDecimal64
,
ids_to_fill
,
keys
,
data_types
,
attribute
,
*
dictionary
);
break
;
}
case
AttributeUnderlyingType
::
Decimal128
:
{
column
=
getColumnFromAttribute
<
Decimal128
,
DecimalGetter
<
Decimal128
>>
(
&
DictionaryType
::
getDecimal128
,
ids_to_fill
,
keys
,
data_types
,
attribute
,
*
dictionary
);
break
;
}
case
AttributeUnderlyingType
::
String
:
{
column
=
getColumnFromStringAttribute
<
StringGetter
>
(
...
...
@@ -350,7 +408,7 @@ Block DictionaryBlockInputStream<DictionaryType, Key>::fillBlock(
break
;
}
}
#undef GET_COLUMN_FORM_ATTRIBUTE
block_columns
.
emplace_back
(
column
,
attribute
.
type
,
attribute
.
name
);
}
}
...
...
@@ -365,12 +423,24 @@ ColumnPtr DictionaryBlockInputStream<DictionaryType, Key>::getColumnFromAttribut
const
Columns
&
keys
,
const
DataTypes
&
data_types
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
dict
)
const
{
if
constexpr
(
IsDecimalNumber
<
AttributeType
>
)
{
auto
size
=
ids_to_fill
.
size
();
if
(
!
keys
.
empty
())
size
=
keys
.
front
()
->
size
();
auto
column
=
ColumnDecimal
<
AttributeType
>::
create
(
size
,
0
);
/// NOTE: There's wrong scale here, but it's unused.
callGetter
(
getter
,
ids_to_fill
,
keys
,
data_types
,
column
->
getData
(),
attribute
,
dict
);
return
column
;
}
else
{
auto
size
=
ids_to_fill
.
size
();
if
(
!
keys
.
empty
())
size
=
keys
.
front
()
->
size
();
auto
column_vector
=
ColumnVector
<
AttributeType
>::
create
(
size
);
callGetter
(
getter
,
ids_to_fill
,
keys
,
data_types
,
column_vector
->
getData
(),
attribute
,
dict
);
return
column_vector
;
}
}
...
...
dbms/src/Dictionaries/DictionaryStructure.cpp
浏览文件 @
f21c4c89
...
...
@@ -104,6 +104,17 @@ AttributeUnderlyingType getAttributeUnderlyingType(const std::string & type)
if
(
it
!=
std
::
end
(
dictionary
))
return
it
->
second
;
if
(
type
.
find
(
"Decimal"
)
==
0
)
{
size_t
start
=
strlen
(
"Decimal"
);
if
(
type
.
find
(
"32"
,
start
)
==
start
)
return
AttributeUnderlyingType
::
Decimal32
;
if
(
type
.
find
(
"64"
,
start
)
==
start
)
return
AttributeUnderlyingType
::
Decimal64
;
if
(
type
.
find
(
"128"
,
start
)
==
start
)
return
AttributeUnderlyingType
::
Decimal128
;
}
throw
Exception
{
"Unknown type "
+
type
,
ErrorCodes
::
UNKNOWN_TYPE
};
}
...
...
@@ -123,6 +134,9 @@ std::string toString(const AttributeUnderlyingType type)
case
AttributeUnderlyingType
::
Int64
:
return
"Int64"
;
case
AttributeUnderlyingType
::
Float32
:
return
"Float32"
;
case
AttributeUnderlyingType
::
Float64
:
return
"Float64"
;
case
AttributeUnderlyingType
::
Decimal32
:
return
"Decimal32"
;
case
AttributeUnderlyingType
::
Decimal64
:
return
"Decimal64"
;
case
AttributeUnderlyingType
::
Decimal128
:
return
"Decimal128"
;
case
AttributeUnderlyingType
::
String
:
return
"String"
;
}
...
...
dbms/src/Dictionaries/DictionaryStructure.h
浏览文件 @
f21c4c89
...
...
@@ -27,6 +27,9 @@ enum class AttributeUnderlyingType
Int64
,
Float32
,
Float64
,
Decimal32
,
Decimal64
,
Decimal128
,
String
};
...
...
dbms/src/Dictionaries/FlatDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -115,7 +115,7 @@ void FlatDictionary::isInConstantVector(
#define DECLARE(TYPE)\
void FlatDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const\
void FlatDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -138,6 +138,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
FlatDictionary
::
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
...
...
@@ -156,7 +159,7 @@ void FlatDictionary::getString(const std::string & attribute_name, const PaddedP
#define DECLARE(TYPE)\
void FlatDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -177,6 +180,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
FlatDictionary
::
getString
(
...
...
@@ -194,8 +200,7 @@ void FlatDictionary::getString(
#define DECLARE(TYPE)\
void FlatDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def,\
PaddedPODArray<TYPE> & out) const\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def, ResultArrayType<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -216,6 +221,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
FlatDictionary
::
getString
(
...
...
@@ -250,6 +258,10 @@ void FlatDictionary::has(const PaddedPODArray<Key> & ids, PaddedPODArray<UInt8>
case
AttributeUnderlyingType
::
Float32
:
has
<
Float32
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Float64
:
has
<
Float64
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
String
:
has
<
String
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
has
<
Decimal32
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
has
<
Decimal64
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
has
<
Decimal128
>
(
attribute
,
ids
,
out
);
break
;
}
}
...
...
@@ -408,6 +420,11 @@ void FlatDictionary::calculateBytesAllocated()
case
AttributeUnderlyingType
::
Int64
:
addAttributeSize
<
Int64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float32
:
addAttributeSize
<
Float32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float64
:
addAttributeSize
<
Float64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
addAttributeSize
<
Decimal32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
addAttributeSize
<
Decimal64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
addAttributeSize
<
Decimal128
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
String
:
{
addAttributeSize
<
StringRef
>
(
attribute
);
...
...
@@ -460,6 +477,10 @@ FlatDictionary::Attribute FlatDictionary::createAttributeWithType(const Attribut
case
AttributeUnderlyingType
::
Float32
:
createAttributeImpl
<
Float32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float64
:
createAttributeImpl
<
Float64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
String
:
createAttributeImpl
<
String
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
createAttributeImpl
<
Decimal32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
createAttributeImpl
<
Decimal64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
createAttributeImpl
<
Decimal128
>
(
attr
,
null_value
);
break
;
}
return
attr
;
...
...
@@ -488,6 +509,9 @@ void FlatDictionary::getItemsNumber(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -563,6 +587,10 @@ void FlatDictionary::setAttributeValue(Attribute & attribute, const Key id, cons
case
AttributeUnderlyingType
::
Float32
:
setAttributeValueImpl
<
Float32
>
(
attribute
,
id
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
Float64
:
setAttributeValueImpl
<
Float64
>
(
attribute
,
id
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
String
:
setAttributeValueImpl
<
String
>
(
attribute
,
id
,
value
.
get
<
String
>
());
break
;
case
AttributeUnderlyingType
::
Decimal32
:
setAttributeValueImpl
<
Decimal32
>
(
attribute
,
id
,
value
.
get
<
Decimal128
>
());
break
;
case
AttributeUnderlyingType
::
Decimal64
:
setAttributeValueImpl
<
Decimal64
>
(
attribute
,
id
,
value
.
get
<
Decimal128
>
());
break
;
case
AttributeUnderlyingType
::
Decimal128
:
setAttributeValueImpl
<
Decimal128
>
(
attribute
,
id
,
value
.
get
<
Decimal128
>
());
break
;
}
}
...
...
dbms/src/Dictionaries/FlatDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -3,6 +3,7 @@
#include <Dictionaries/IDictionary.h>
#include <Dictionaries/IDictionarySource.h>
#include <Dictionaries/DictionaryStructure.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <Common/Arena.h>
#include <ext/range.h>
...
...
@@ -69,8 +70,11 @@ public:
void
isInVectorConstant
(
const
PaddedPODArray
<
Key
>
&
child_ids
,
const
Key
ancestor_id
,
PaddedPODArray
<
UInt8
>
&
out
)
const
override
;
void
isInConstantVector
(
const
Key
child_id
,
const
PaddedPODArray
<
Key
>
&
ancestor_ids
,
PaddedPODArray
<
UInt8
>
&
out
)
const
override
;
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE(TYPE)\
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const;
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -82,6 +86,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
;
...
...
@@ -89,7 +96,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -101,6 +108,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -110,7 +120,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE def,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -122,6 +132,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -143,12 +156,14 @@ private:
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
StringRef
>
null_values
;
std
::
tuple
<
ContainerPtrType
<
UInt8
>
,
ContainerPtrType
<
UInt16
>
,
ContainerPtrType
<
UInt32
>
,
ContainerPtrType
<
UInt64
>
,
ContainerPtrType
<
UInt128
>
,
ContainerPtrType
<
Int8
>
,
ContainerPtrType
<
Int16
>
,
ContainerPtrType
<
Int32
>
,
ContainerPtrType
<
Int64
>
,
ContainerPtrType
<
Decimal32
>
,
ContainerPtrType
<
Decimal64
>
,
ContainerPtrType
<
Decimal128
>
,
ContainerPtrType
<
Float32
>
,
ContainerPtrType
<
Float64
>
,
ContainerPtrType
<
StringRef
>>
arrays
;
std
::
unique_ptr
<
Arena
>
string_arena
;
...
...
dbms/src/Dictionaries/HashedDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -110,7 +110,7 @@ void HashedDictionary::isInConstantVector(
#define DECLARE(TYPE)\
void HashedDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const\
void HashedDictionary::get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -133,6 +133,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
HashedDictionary
::
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
...
...
@@ -151,7 +154,7 @@ void HashedDictionary::getString(const std::string & attribute_name, const Padde
#define DECLARE(TYPE)\
void HashedDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -172,6 +175,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
HashedDictionary
::
getString
(
...
...
@@ -189,7 +195,7 @@ void HashedDictionary::getString(
#define DECLARE(TYPE)\
void HashedDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE & def,
PaddedPODArray
<TYPE> & out) const\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE & def,
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttribute(attribute_name);\
if (!isAttributeTypeConvertibleTo(attribute.type, AttributeUnderlyingType::TYPE))\
...
...
@@ -210,6 +216,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
HashedDictionary
::
getString
(
...
...
@@ -243,6 +252,10 @@ void HashedDictionary::has(const PaddedPODArray<Key> & ids, PaddedPODArray<UInt8
case
AttributeUnderlyingType
::
Float32
:
has
<
Float32
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Float64
:
has
<
Float64
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
String
:
has
<
StringRef
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
has
<
Decimal32
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
has
<
Decimal64
>
(
attribute
,
ids
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
has
<
Decimal128
>
(
attribute
,
ids
,
out
);
break
;
}
}
...
...
@@ -398,6 +411,11 @@ void HashedDictionary::calculateBytesAllocated()
case
AttributeUnderlyingType
::
Int64
:
addAttributeSize
<
Int64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float32
:
addAttributeSize
<
Float32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float64
:
addAttributeSize
<
Float64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
addAttributeSize
<
Decimal32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
addAttributeSize
<
Decimal64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
addAttributeSize
<
Decimal128
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
String
:
{
addAttributeSize
<
StringRef
>
(
attribute
);
...
...
@@ -433,6 +451,11 @@ HashedDictionary::Attribute HashedDictionary::createAttributeWithType(const Attr
case
AttributeUnderlyingType
::
Int64
:
createAttributeImpl
<
Int64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float32
:
createAttributeImpl
<
Float32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float64
:
createAttributeImpl
<
Float64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
createAttributeImpl
<
Decimal32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
createAttributeImpl
<
Decimal64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
createAttributeImpl
<
Decimal128
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
String
:
{
std
::
get
<
String
>
(
attr
.
null_values
)
=
null_value
.
get
<
String
>
();
...
...
@@ -468,6 +491,9 @@ void HashedDictionary::getItemsNumber(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -515,6 +541,11 @@ void HashedDictionary::setAttributeValue(Attribute & attribute, const Key id, co
case
AttributeUnderlyingType
::
Int64
:
setAttributeValueImpl
<
Int64
>
(
attribute
,
id
,
value
.
get
<
Int64
>
());
break
;
case
AttributeUnderlyingType
::
Float32
:
setAttributeValueImpl
<
Float32
>
(
attribute
,
id
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
Float64
:
setAttributeValueImpl
<
Float64
>
(
attribute
,
id
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
Decimal32
:
setAttributeValueImpl
<
Decimal32
>
(
attribute
,
id
,
value
.
get
<
Decimal32
>
());
break
;
case
AttributeUnderlyingType
::
Decimal64
:
setAttributeValueImpl
<
Decimal64
>
(
attribute
,
id
,
value
.
get
<
Decimal64
>
());
break
;
case
AttributeUnderlyingType
::
Decimal128
:
setAttributeValueImpl
<
Decimal128
>
(
attribute
,
id
,
value
.
get
<
Decimal128
>
());
break
;
case
AttributeUnderlyingType
::
String
:
{
auto
&
map
=
*
std
::
get
<
CollectionPtrType
<
StringRef
>>
(
attribute
.
maps
);
...
...
@@ -578,6 +609,10 @@ PaddedPODArray<HashedDictionary::Key> HashedDictionary::getIds() const
case
AttributeUnderlyingType
::
Float32
:
return
getIds
<
Float32
>
(
attribute
);
case
AttributeUnderlyingType
::
Float64
:
return
getIds
<
Float64
>
(
attribute
);
case
AttributeUnderlyingType
::
String
:
return
getIds
<
StringRef
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal32
:
return
getIds
<
Decimal32
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal64
:
return
getIds
<
Decimal64
>
(
attribute
);
case
AttributeUnderlyingType
::
Decimal128
:
return
getIds
<
Decimal128
>
(
attribute
);
}
return
PaddedPODArray
<
Key
>
();
}
...
...
dbms/src/Dictionaries/HashedDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -4,6 +4,7 @@
#include <Dictionaries/IDictionarySource.h>
#include <Dictionaries/DictionaryStructure.h>
#include <Common/HashTable/HashMap.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <ext/range.h>
#include <atomic>
...
...
@@ -64,8 +65,11 @@ public:
void
toParent
(
const
PaddedPODArray
<
Key
>
&
ids
,
PaddedPODArray
<
Key
>
&
out
)
const
override
;
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE(TYPE)\
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
PaddedPODArray
<TYPE> & out) const;
void get##TYPE(const std::string & attribute_name, const PaddedPODArray<Key> & ids,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -77,6 +81,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
const
std
::
string
&
attribute_name
,
const
PaddedPODArray
<
Key
>
&
ids
,
ColumnString
*
out
)
const
;
...
...
@@ -84,7 +91,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<TYPE> & def,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -96,6 +103,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -104,7 +114,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE & def,
PaddedPODArray
<TYPE> & out) const;
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const TYPE & def,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -116,6 +126,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -141,12 +154,14 @@ private:
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
CollectionPtrType
<
UInt8
>
,
CollectionPtrType
<
UInt16
>
,
CollectionPtrType
<
UInt32
>
,
CollectionPtrType
<
UInt64
>
,
CollectionPtrType
<
UInt128
>
,
CollectionPtrType
<
Int8
>
,
CollectionPtrType
<
Int16
>
,
CollectionPtrType
<
Int32
>
,
CollectionPtrType
<
Int64
>
,
CollectionPtrType
<
Decimal32
>
,
CollectionPtrType
<
Decimal64
>
,
CollectionPtrType
<
Decimal128
>
,
CollectionPtrType
<
Float32
>
,
CollectionPtrType
<
Float64
>
,
CollectionPtrType
<
StringRef
>>
maps
;
std
::
unique_ptr
<
Arena
>
string_arena
;
...
...
dbms/src/Dictionaries/MongoDBDictionarySource.cpp
浏览文件 @
f21c4c89
...
...
@@ -250,6 +250,9 @@ BlockInputStreamPtr MongoDBDictionarySource::loadKeys(
case
AttributeUnderlyingType
::
Int16
:
case
AttributeUnderlyingType
::
Int32
:
case
AttributeUnderlyingType
::
Int64
:
case
AttributeUnderlyingType
::
Decimal32
:
case
AttributeUnderlyingType
::
Decimal64
:
case
AttributeUnderlyingType
::
Decimal128
:
key
.
add
(
attr
.
second
.
name
,
Int32
(
key_columns
[
attr
.
first
]
->
get64
(
row_idx
)));
break
;
...
...
dbms/src/Dictionaries/RangeDictionaryBlockInputStream.h
浏览文件 @
f21c4c89
...
...
@@ -41,8 +41,12 @@ private:
using
DictionaryGetter
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
PaddedPODArray
<
Key
>
&
,
const
PaddedPODArray
<
Int64
>
&
,
PaddedPODArray
<
Type
>
&
)
const
;
template
<
typename
AttributeType
>
ColumnPtr
getColumnFromAttribute
(
DictionaryGetter
<
AttributeType
>
getter
,
template
<
typename
Type
>
using
DictionaryDecimalGetter
=
void
(
DictionaryType
::*
)(
const
std
::
string
&
,
const
PaddedPODArray
<
Key
>
&
,
const
PaddedPODArray
<
Int64
>
&
,
DecimalPaddedPODArray
<
Type
>
&
)
const
;
template
<
typename
AttributeType
,
typename
Getter
>
ColumnPtr
getColumnFromAttribute
(
Getter
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
PaddedPODArray
<
Int64
>
&
dates
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
concrete_dictionary
)
const
;
ColumnPtr
getColumnFromAttributeString
(
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
PaddedPODArray
<
Int64
>
&
dates
,
...
...
@@ -101,14 +105,23 @@ Block RangeDictionaryBlockInputStream<DictionaryType, RangeType, Key>::getBlock(
}
template
<
typename
DictionaryType
,
typename
RangeType
,
typename
Key
>
template
<
typename
AttributeType
>
template
<
typename
AttributeType
,
typename
Getter
>
ColumnPtr
RangeDictionaryBlockInputStream
<
DictionaryType
,
RangeType
,
Key
>::
getColumnFromAttribute
(
DictionaryGetter
<
AttributeType
>
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
Getter
getter
,
const
PaddedPODArray
<
Key
>
&
ids_to_fill
,
const
PaddedPODArray
<
Int64
>
&
dates
,
const
DictionaryAttribute
&
attribute
,
const
DictionaryType
&
concrete_dictionary
)
const
{
if
constexpr
(
IsDecimalNumber
<
AttributeType
>
)
{
auto
column
=
ColumnDecimal
<
AttributeType
>::
create
(
ids_to_fill
.
size
(),
0
);
/// NOTE: There's wrong scale here, but it's unused.
(
concrete_dictionary
.
*
getter
)(
attribute
.
name
,
ids_to_fill
,
dates
,
column
->
getData
());
return
column
;
}
else
{
auto
column_vector
=
ColumnVector
<
AttributeType
>::
create
(
ids_to_fill
.
size
());
(
concrete_dictionary
.
*
getter
)(
attribute
.
name
,
ids_to_fill
,
dates
,
column_vector
->
getData
());
return
column_vector
;
}
}
template
<
typename
DictionaryType
,
typename
RangeType
,
typename
Key
>
...
...
@@ -224,11 +237,20 @@ Block RangeDictionaryBlockInputStream<DictionaryType, RangeType, Key>::fillBlock
case
AttributeUnderlyingType
::
Float64
:
GET_COLUMN_FORM_ATTRIBUTE
(
Float64
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
GET_COLUMN_FORM_ATTRIBUTE
(
Decimal32
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
GET_COLUMN_FORM_ATTRIBUTE
(
Decimal64
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
GET_COLUMN_FORM_ATTRIBUTE
(
Decimal128
);
break
;
case
AttributeUnderlyingType
::
String
:
column
=
getColumnFromAttributeString
(
ids_to_fill
,
date_key
,
attribute
,
*
dictionary
);
break
;
}
#undef GET_COLUMN_FORM_ATTRIBUTE
columns
.
emplace_back
(
column
,
attribute
.
type
,
attribute
.
name
);
}
}
...
...
dbms/src/Dictionaries/RangeHashedDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -99,7 +99,7 @@ RangeHashedDictionary::RangeHashedDictionary(const RangeHashedDictionary & other
#define DECLARE_MULTIPLE_GETTER(TYPE)\
void RangeHashedDictionary::get##TYPE(\
const std::string & attribute_name, const PaddedPODArray<Key> & ids, const PaddedPODArray<RangeStorageType> & dates,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
const auto & attribute = getAttributeWithType(attribute_name, AttributeUnderlyingType::TYPE);\
getItems<TYPE>(attribute, ids, dates, out);\
...
...
@@ -115,6 +115,9 @@ DECLARE_MULTIPLE_GETTER(Int32)
DECLARE_MULTIPLE_GETTER
(
Int64
)
DECLARE_MULTIPLE_GETTER
(
Float32
)
DECLARE_MULTIPLE_GETTER
(
Float64
)
DECLARE_MULTIPLE_GETTER
(
Decimal32
)
DECLARE_MULTIPLE_GETTER
(
Decimal64
)
DECLARE_MULTIPLE_GETTER
(
Decimal128
)
#undef DECLARE_MULTIPLE_GETTER
void
RangeHashedDictionary
::
getString
(
...
...
@@ -239,6 +242,11 @@ void RangeHashedDictionary::calculateBytesAllocated()
case
AttributeUnderlyingType
::
Int64
:
addAttributeSize
<
Int64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float32
:
addAttributeSize
<
Float32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float64
:
addAttributeSize
<
Float64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
addAttributeSize
<
Decimal32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
addAttributeSize
<
Decimal64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
addAttributeSize
<
Decimal128
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
String
:
{
addAttributeSize
<
StringRef
>
(
attribute
);
...
...
@@ -274,6 +282,11 @@ RangeHashedDictionary::Attribute RangeHashedDictionary::createAttributeWithType(
case
AttributeUnderlyingType
::
Int64
:
createAttributeImpl
<
Int64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float32
:
createAttributeImpl
<
Float32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float64
:
createAttributeImpl
<
Float64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
createAttributeImpl
<
Decimal32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
createAttributeImpl
<
Decimal64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
createAttributeImpl
<
Decimal128
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
String
:
{
std
::
get
<
String
>
(
attr
.
null_values
)
=
null_value
.
get
<
String
>
();
...
...
@@ -309,6 +322,9 @@ void RangeHashedDictionary::getItems(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -381,6 +397,17 @@ void RangeHashedDictionary::setAttributeValue(Attribute & attribute, const Key i
case
AttributeUnderlyingType
::
Int64
:
setAttributeValueImpl
<
Int64
>
(
attribute
,
id
,
range
,
value
.
get
<
Int64
>
());
break
;
case
AttributeUnderlyingType
::
Float32
:
setAttributeValueImpl
<
Float32
>
(
attribute
,
id
,
range
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
Float64
:
setAttributeValueImpl
<
Float64
>
(
attribute
,
id
,
range
,
value
.
get
<
Float64
>
());
break
;
case
AttributeUnderlyingType
::
Decimal32
:
setAttributeValueImpl
<
Decimal32
>
(
attribute
,
id
,
range
,
value
.
get
<
Decimal32
>
());
break
;
case
AttributeUnderlyingType
::
Decimal64
:
setAttributeValueImpl
<
Decimal64
>
(
attribute
,
id
,
range
,
value
.
get
<
Decimal64
>
());
break
;
case
AttributeUnderlyingType
::
Decimal128
:
setAttributeValueImpl
<
Decimal128
>
(
attribute
,
id
,
range
,
value
.
get
<
Decimal128
>
());
break
;
case
AttributeUnderlyingType
::
String
:
{
auto
&
map
=
*
std
::
get
<
Ptr
<
StringRef
>>
(
attribute
.
maps
);
...
...
@@ -449,6 +476,10 @@ void RangeHashedDictionary::getIdsAndDates(PaddedPODArray<Key> & ids,
case
AttributeUnderlyingType
::
Float32
:
getIdsAndDates
<
Float32
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
case
AttributeUnderlyingType
::
Float64
:
getIdsAndDates
<
Float64
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
case
AttributeUnderlyingType
::
String
:
getIdsAndDates
<
StringRef
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
getIdsAndDates
<
Decimal32
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
getIdsAndDates
<
Decimal64
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
getIdsAndDates
<
Decimal128
>
(
attribute
,
ids
,
start_dates
,
end_dates
);
break
;
}
}
...
...
@@ -512,7 +543,7 @@ struct RangeHashedDIctionaryCallGetBlockInputStreamImpl
BlockInputStreamPtr
RangeHashedDictionary
::
getBlockInputStream
(
const
Names
&
column_names
,
size_t
max_block_size
)
const
{
using
ListType
=
TypeList
<
UInt8
,
UInt16
,
UInt32
,
UInt64
,
Int8
,
Int16
,
Int32
,
Int64
,
Float32
,
Float64
>
;
using
ListType
=
TypeList
<
UInt8
,
UInt16
,
UInt32
,
UInt64
,
Int8
,
Int16
,
Int32
,
Int64
,
Int128
,
Float32
,
Float64
>
;
RangeHashedDIctionaryCallGetBlockInputStreamImpl
callable
;
callable
.
dict
=
this
;
...
...
dbms/src/Dictionaries/RangeHashedDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -4,6 +4,7 @@
#include <Dictionaries/IDictionarySource.h>
#include <Dictionaries/DictionaryStructure.h>
#include <Common/HashTable/HashMap.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <atomic>
...
...
@@ -61,12 +62,15 @@ public:
typedef
Int64
RangeStorageType
;
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE_MULTIPLE_GETTER(TYPE)\
void get##TYPE(\
const std::string & attribute_name,\
const PaddedPODArray<Key> & ids,\
const PaddedPODArray<RangeStorageType> & dates,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE_MULTIPLE_GETTER
(
UInt8
)
DECLARE_MULTIPLE_GETTER
(
UInt16
)
DECLARE_MULTIPLE_GETTER
(
UInt32
)
...
...
@@ -78,6 +82,9 @@ public:
DECLARE_MULTIPLE_GETTER
(
Int64
)
DECLARE_MULTIPLE_GETTER
(
Float32
)
DECLARE_MULTIPLE_GETTER
(
Float64
)
DECLARE_MULTIPLE_GETTER
(
Decimal32
)
DECLARE_MULTIPLE_GETTER
(
Decimal64
)
DECLARE_MULTIPLE_GETTER
(
Decimal128
)
#undef DECLARE_MULTIPLE_GETTER
void
getString
(
...
...
@@ -114,11 +121,13 @@ private:
std
::
tuple
<
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
Ptr
<
UInt8
>
,
Ptr
<
UInt16
>
,
Ptr
<
UInt32
>
,
Ptr
<
UInt64
>
,
Ptr
<
UInt128
>
,
Ptr
<
Int8
>
,
Ptr
<
Int16
>
,
Ptr
<
Int32
>
,
Ptr
<
Int64
>
,
Ptr
<
Decimal32
>
,
Ptr
<
Decimal64
>
,
Ptr
<
Decimal128
>
,
Ptr
<
Float32
>
,
Ptr
<
Float64
>
,
Ptr
<
StringRef
>>
maps
;
std
::
unique_ptr
<
Arena
>
string_arena
;
};
...
...
dbms/src/Dictionaries/TrieDictionary.cpp
浏览文件 @
f21c4c89
...
...
@@ -62,7 +62,7 @@ TrieDictionary::~TrieDictionary()
#define DECLARE(TYPE)\
void TrieDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
PaddedPODArray
<TYPE> & out) const\
ResultArrayType
<TYPE> & out) const\
{\
validateKeyTypes(key_types);\
\
...
...
@@ -87,6 +87,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
TrieDictionary
::
getString
(
...
...
@@ -109,7 +112,7 @@ void TrieDictionary::getString(
#define DECLARE(TYPE)\
void TrieDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const PaddedPODArray<TYPE> & def,
PaddedPODArray
<TYPE> & out) const\
const PaddedPODArray<TYPE> & def,
ResultArrayType
<TYPE> & out) const\
{\
validateKeyTypes(key_types);\
\
...
...
@@ -132,6 +135,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
TrieDictionary
::
getString
(
...
...
@@ -152,7 +158,7 @@ void TrieDictionary::getString(
#define DECLARE(TYPE)\
void TrieDictionary::get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const TYPE def,
PaddedPODArray
<TYPE> & out) const\
const TYPE def,
ResultArrayType
<TYPE> & out) const\
{\
validateKeyTypes(key_types);\
\
...
...
@@ -175,6 +181,9 @@ DECLARE(Int32)
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
TrieDictionary
::
getString
(
...
...
@@ -212,6 +221,10 @@ void TrieDictionary::has(const Columns & key_columns, const DataTypes & key_type
case
AttributeUnderlyingType
::
Float32
:
has
<
Float32
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Float64
:
has
<
Float64
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
String
:
has
<
StringRef
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
has
<
Decimal32
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
has
<
Decimal64
>
(
attribute
,
key_columns
,
out
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
has
<
Decimal128
>
(
attribute
,
key_columns
,
out
);
break
;
}
}
...
...
@@ -306,6 +319,11 @@ void TrieDictionary::calculateBytesAllocated()
case
AttributeUnderlyingType
::
Int64
:
addAttributeSize
<
Int64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float32
:
addAttributeSize
<
Float32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Float64
:
addAttributeSize
<
Float64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
addAttributeSize
<
Decimal32
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
addAttributeSize
<
Decimal64
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
addAttributeSize
<
Decimal128
>
(
attribute
);
break
;
case
AttributeUnderlyingType
::
String
:
{
addAttributeSize
<
StringRef
>
(
attribute
);
...
...
@@ -355,6 +373,11 @@ TrieDictionary::Attribute TrieDictionary::createAttributeWithType(const Attribut
case
AttributeUnderlyingType
::
Int64
:
createAttributeImpl
<
Int64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float32
:
createAttributeImpl
<
Float32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Float64
:
createAttributeImpl
<
Float64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal32
:
createAttributeImpl
<
Decimal32
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal64
:
createAttributeImpl
<
Decimal64
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
Decimal128
:
createAttributeImpl
<
Decimal128
>
(
attr
,
null_value
);
break
;
case
AttributeUnderlyingType
::
String
:
{
std
::
get
<
String
>
(
attr
.
null_values
)
=
null_value
.
get
<
String
>
();
...
...
@@ -390,6 +413,9 @@ void TrieDictionary::getItemsNumber(
DISPATCH
(
Int64
)
DISPATCH
(
Float32
)
DISPATCH
(
Float64
)
DISPATCH
(
Decimal32
)
DISPATCH
(
Decimal64
)
DISPATCH
(
Decimal128
)
#undef DISPATCH
else
throw
Exception
(
"Unexpected type of attribute: "
+
toString
(
attribute
.
type
),
ErrorCodes
::
LOGICAL_ERROR
);
...
...
@@ -490,6 +516,11 @@ bool TrieDictionary::setAttributeValue(Attribute & attribute, const StringRef ke
case
AttributeUnderlyingType
::
Int64
:
return
setAttributeValueImpl
<
Int64
>
(
attribute
,
key
,
value
.
get
<
Int64
>
());
case
AttributeUnderlyingType
::
Float32
:
return
setAttributeValueImpl
<
Float32
>
(
attribute
,
key
,
value
.
get
<
Float64
>
());
case
AttributeUnderlyingType
::
Float64
:
return
setAttributeValueImpl
<
Float64
>
(
attribute
,
key
,
value
.
get
<
Float64
>
());
case
AttributeUnderlyingType
::
Decimal32
:
return
setAttributeValueImpl
<
Decimal32
>
(
attribute
,
key
,
value
.
get
<
Decimal32
>
());
case
AttributeUnderlyingType
::
Decimal64
:
return
setAttributeValueImpl
<
Decimal64
>
(
attribute
,
key
,
value
.
get
<
Decimal64
>
());
case
AttributeUnderlyingType
::
Decimal128
:
return
setAttributeValueImpl
<
Decimal128
>
(
attribute
,
key
,
value
.
get
<
Decimal128
>
());
case
AttributeUnderlyingType
::
String
:
{
const
auto
&
string
=
value
.
get
<
String
>
();
...
...
dbms/src/Dictionaries/TrieDictionary.h
浏览文件 @
f21c4c89
...
...
@@ -5,6 +5,7 @@
#include <Dictionaries/DictionaryStructure.h>
#include <common/StringRef.h>
#include <Common/HashTable/HashMap.h>
#include <Columns/ColumnDecimal.h>
#include <Columns/ColumnString.h>
#include <Common/Arena.h>
#include <ext/range.h>
...
...
@@ -68,10 +69,13 @@ public:
return
dict_struct
.
attributes
[
&
getAttribute
(
attribute_name
)
-
attributes
.
data
()].
injective
;
}
template
<
typename
T
>
using
ResultArrayType
=
std
::
conditional_t
<
IsDecimalNumber
<
T
>
,
DecimalPaddedPODArray
<
T
>
,
PaddedPODArray
<
T
>>
;
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
PaddedPODArray
<TYPE> & out) const;
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -83,6 +87,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -92,7 +99,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const PaddedPODArray<TYPE> & def,
PaddedPODArray
<TYPE> & out) const;
const PaddedPODArray<TYPE> & def,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -104,6 +111,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -113,7 +123,7 @@ public:
#define DECLARE(TYPE)\
void get##TYPE(\
const std::string & attribute_name, const Columns & key_columns, const DataTypes & key_types,\
const TYPE def,
PaddedPODArray
<TYPE> & out) const;
const TYPE def,
ResultArrayType
<TYPE> & out) const;
DECLARE
(
UInt8
)
DECLARE
(
UInt16
)
DECLARE
(
UInt32
)
...
...
@@ -125,6 +135,9 @@ public:
DECLARE
(
Int64
)
DECLARE
(
Float32
)
DECLARE
(
Float64
)
DECLARE
(
Decimal32
)
DECLARE
(
Decimal64
)
DECLARE
(
Decimal128
)
#undef DECLARE
void
getString
(
...
...
@@ -146,12 +159,14 @@ private:
UInt8
,
UInt16
,
UInt32
,
UInt64
,
UInt128
,
Int8
,
Int16
,
Int32
,
Int64
,
Decimal32
,
Decimal64
,
Decimal128
,
Float32
,
Float64
,
String
>
null_values
;
std
::
tuple
<
ContainerPtrType
<
UInt8
>
,
ContainerPtrType
<
UInt16
>
,
ContainerPtrType
<
UInt32
>
,
ContainerPtrType
<
UInt64
>
,
ContainerPtrType
<
UInt128
>
,
ContainerPtrType
<
Int8
>
,
ContainerPtrType
<
Int16
>
,
ContainerPtrType
<
Int32
>
,
ContainerPtrType
<
Int64
>
,
ContainerPtrType
<
Decimal32
>
,
ContainerPtrType
<
Decimal64
>
,
ContainerPtrType
<
Decimal128
>
,
ContainerPtrType
<
Float32
>
,
ContainerPtrType
<
Float64
>
,
ContainerPtrType
<
StringRef
>>
maps
;
std
::
unique_ptr
<
Arena
>
string_arena
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录