Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
2dot5
ClickHouse
提交
42b07c5e
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,发现更多精彩内容 >>
提交
42b07c5e
编写于
3月 29, 2019
作者:
B
bgranvea
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
refactor to avoid dynamic_cast in data type serialization
上级
caa096a3
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
139 addition
and
162 deletion
+139
-162
dbms/src/DataStreams/AggregatingSortedBlockInputStream.cpp
dbms/src/DataStreams/AggregatingSortedBlockInputStream.cpp
+3
-3
dbms/src/DataTypes/DataTypeCustom.h
dbms/src/DataTypes/DataTypeCustom.h
+36
-33
dbms/src/DataTypes/DataTypeCustomIPv4AndIPv6.cpp
dbms/src/DataTypes/DataTypeCustomIPv4AndIPv6.cpp
+20
-20
dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp
dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.cpp
+6
-25
dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.h
dbms/src/DataTypes/DataTypeCustomSimpleAggregateFunction.h
+5
-8
dbms/src/DataTypes/DataTypeCustomSimpleTextSerialization.cpp
dbms/src/DataTypes/DataTypeCustomSimpleTextSerialization.cpp
+13
-13
dbms/src/DataTypes/DataTypeCustomSimpleTextSerialization.h
dbms/src/DataTypes/DataTypeCustomSimpleTextSerialization.h
+4
-4
dbms/src/DataTypes/DataTypeFactory.cpp
dbms/src/DataTypes/DataTypeFactory.cpp
+5
-5
dbms/src/DataTypes/DataTypeFactory.h
dbms/src/DataTypes/DataTypeFactory.h
+6
-9
dbms/src/DataTypes/IDataType.cpp
dbms/src/DataTypes/IDataType.cpp
+32
-31
dbms/src/DataTypes/IDataType.h
dbms/src/DataTypes/IDataType.h
+9
-11
未找到文件。
dbms/src/DataStreams/AggregatingSortedBlockInputStream.cpp
浏览文件 @
42b07c5e
...
...
@@ -2,7 +2,7 @@
#include <Common/typeid_cast.h>
#include <Common/StringUtils/StringUtils.h>
#include <DataTypes/DataTypeAggregateFunction.h>
#include <DataTypes/DataType
Domain
SimpleAggregateFunction.h>
#include <DataTypes/DataType
Custom
SimpleAggregateFunction.h>
namespace
DB
...
...
@@ -24,7 +24,7 @@ AggregatingSortedBlockInputStream::AggregatingSortedBlockInputStream(
ColumnWithTypeAndName
&
column
=
header
.
safeGetByPosition
(
i
);
/// We leave only states of aggregate functions.
if
(
!
dynamic_cast
<
const
DataTypeAggregateFunction
*>
(
column
.
type
.
get
())
&&
!
findSimpleAggregateFunction
(
column
.
type
))
if
(
!
dynamic_cast
<
const
DataTypeAggregateFunction
*>
(
column
.
type
.
get
())
&&
!
dynamic_cast
<
const
DataTypeCustomSimpleAggregateFunction
*>
(
column
.
type
->
getCustomName
()
))
{
column_numbers_not_to_aggregate
.
push_back
(
i
);
continue
;
...
...
@@ -42,7 +42,7 @@ AggregatingSortedBlockInputStream::AggregatingSortedBlockInputStream(
continue
;
}
if
(
auto
simple_aggr
=
findSimpleAggregateFunction
(
column
.
type
))
if
(
auto
simple_aggr
=
dynamic_cast
<
const
DataTypeCustomSimpleAggregateFunction
*>
(
column
.
type
->
getCustomName
()
))
{
// simple aggregate function
SimpleAggregateDescription
desc
{
simple_aggr
->
getFunction
(),
i
};
...
...
dbms/src/DataTypes/
IDataTypeDomain
.h
→
dbms/src/DataTypes/
DataTypeCustom
.h
浏览文件 @
42b07c5e
#pragma once
#include <memory>
#include <cstddef>
#include <Core/Types.h>
#include <DataTypes/IDataType.h>
namespace
DB
{
...
...
@@ -12,45 +12,21 @@ class WriteBuffer;
struct
FormatSettings
;
class
IColumn
;
/** Allow to customize an existing data type and set a different name. Derived class IDataTypeDomainCustomSerialization allows
* further customization of serialization/deserialization methods. See use in IPv4 and IPv6 data type domains.
*
* IDataTypeDomain can be chained for further delegation (only for getName for the moment).
/** Allow to customize an existing data type and set a different name and/or text serialization/deserialization methods.
* See use in IPv4 and IPv6 data types, and also in SimpleAggregateFunction.
*/
class
IDataType
Domain
class
IDataType
CustomName
{
private:
mutable
DataTypeDomainPtr
delegate
;
public:
virtual
~
IDataTypeDomain
()
{}
String
getName
()
const
{
if
(
delegate
)
return
delegate
->
getName
();
else
return
doGetName
();
}
void
appendDomain
(
DataTypeDomainPtr
delegate_
)
const
{
if
(
delegate
==
nullptr
)
delegate
=
std
::
move
(
delegate_
);
else
delegate
->
appendDomain
(
std
::
move
(
delegate_
));
}
const
IDataTypeDomain
*
getDomain
()
const
{
return
delegate
.
get
();
}
protected:
virtual
String
doGetName
()
const
=
0
;
virtual
~
IDataTypeCustomName
()
{}
virtual
String
getName
()
const
=
0
;
};
class
IDataType
DomainCustomSerialization
:
public
IDataTypeDomai
n
class
IDataType
CustomTextSerializatio
n
{
public:
virtual
~
IDataType
DomainCustom
Serialization
()
{}
virtual
~
IDataType
CustomText
Serialization
()
{}
/** Text serialization for displaying on a terminal or saving into a text file, and the like.
* Without escaping or quoting.
...
...
@@ -82,4 +58,31 @@ public:
virtual
void
serializeTextXML
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
=
0
;
};
using
DataTypeCustomNamePtr
=
std
::
unique_ptr
<
const
IDataTypeCustomName
>
;
using
DataTypeCustomTextSerializationPtr
=
std
::
unique_ptr
<
const
IDataTypeCustomTextSerialization
>
;
/** Describe a data type customization
*/
struct
DataTypeCustomDesc
{
DataTypeCustomNamePtr
name
;
DataTypeCustomTextSerializationPtr
text_serialization
;
DataTypeCustomDesc
(
DataTypeCustomNamePtr
name_
,
DataTypeCustomTextSerializationPtr
text_serialization_
)
:
name
(
std
::
move
(
name_
)),
text_serialization
(
std
::
move
(
text_serialization_
))
{}
};
using
DataTypeCustomDescPtr
=
std
::
unique_ptr
<
DataTypeCustomDesc
>
;
/** A simple implementation of IDataTypeCustomName
*/
class
DataTypeCustomFixedName
:
public
IDataTypeCustomName
{
private:
String
name
;
public:
DataTypeCustomFixedName
(
String
name_
)
:
name
(
name_
)
{}
String
getName
()
const
override
{
return
name
;
}
};
}
// namespace DB
dbms/src/DataTypes/DataType
Domain
IPv4AndIPv6.cpp
→
dbms/src/DataTypes/DataType
Custom
IPv4AndIPv6.cpp
浏览文件 @
42b07c5e
#include <Columns/ColumnsNumber.h>
#include <Common/Exception.h>
#include <Common/formatIPv6.h>
#include <DataTypes/DataType
DomainWithSimple
Serialization.h>
#include <DataTypes/DataType
CustomSimpleText
Serialization.h>
#include <DataTypes/DataTypeFactory.h>
#include <DataTypes/
IDataTypeDomain
.h>
#include <DataTypes/
DataTypeCustom
.h>
#include <Functions/FunctionHelpers.h>
#include <Functions/FunctionsCoding.h>
...
...
@@ -20,20 +20,15 @@ namespace ErrorCodes
namespace
{
class
DataType
DomainIPv4
:
public
DataTypeDomainWithSimple
Serialization
class
DataType
CustomIPv4Serialization
:
public
DataTypeCustomSimpleText
Serialization
{
public:
String
doGetName
()
const
override
{
return
"IPv4"
;
}
void
serializeText
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
)
const
override
{
const
auto
col
=
checkAndGetColumn
<
ColumnUInt32
>
(
&
column
);
if
(
!
col
)
{
throw
Exception
(
getName
()
+
" domain
can only serialize columns of type UInt32."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
throw
Exception
(
"IPv4 type
can only serialize columns of type UInt32."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
}
char
buffer
[
IPV4_MAX_TEXT_LENGTH
+
1
]
=
{
'\0'
};
...
...
@@ -48,7 +43,7 @@ public:
ColumnUInt32
*
col
=
typeid_cast
<
ColumnUInt32
*>
(
&
column
);
if
(
!
col
)
{
throw
Exception
(
getName
()
+
" domain
can only deserialize columns of type UInt32."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
throw
Exception
(
"IPv4 type
can only deserialize columns of type UInt32."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
}
char
buffer
[
IPV4_MAX_TEXT_LENGTH
+
1
]
=
{
'\0'
};
...
...
@@ -63,20 +58,16 @@ public:
}
};
class
DataType
DomainIPv6
:
public
DataTypeDomainWithSimple
Serialization
class
DataType
CustomIPv6Serialization
:
public
DataTypeCustomSimpleText
Serialization
{
public:
String
doGetName
()
const
override
{
return
"IPv6"
;
}
void
serializeText
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
)
const
override
{
const
auto
col
=
checkAndGetColumn
<
ColumnFixedString
>
(
&
column
);
if
(
!
col
)
{
throw
Exception
(
getName
()
+
"
domain can only serialize columns of type FixedString(16)."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
throw
Exception
(
"IPv6 type
domain can only serialize columns of type FixedString(16)."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
}
char
buffer
[
IPV6_MAX_TEXT_LENGTH
+
1
]
=
{
'\0'
};
...
...
@@ -91,7 +82,7 @@ public:
ColumnFixedString
*
col
=
typeid_cast
<
ColumnFixedString
*>
(
&
column
);
if
(
!
col
)
{
throw
Exception
(
getName
()
+
"
domain can only deserialize columns of type FixedString(16)."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
throw
Exception
(
"IPv6 type
domain can only deserialize columns of type FixedString(16)."
+
column
.
getName
(),
ErrorCodes
::
ILLEGAL_COLUMN
);
}
char
buffer
[
IPV6_MAX_TEXT_LENGTH
+
1
]
=
{
'\0'
};
...
...
@@ -100,7 +91,7 @@ public:
std
::
string
ipv6_value
(
IPV6_BINARY_LENGTH
,
'\0'
);
if
(
!
parseIPv6
(
buffer
,
reinterpret_cast
<
unsigned
char
*>
(
ipv6_value
.
data
())))
{
throw
Exception
(
"Invalid
"
+
getName
()
+
"
value."
,
ErrorCodes
::
CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING
);
throw
Exception
(
"Invalid
IPv6
value."
,
ErrorCodes
::
CANNOT_PARSE_DOMAIN_VALUE_FROM_STRING
);
}
col
->
insertString
(
ipv6_value
);
...
...
@@ -111,8 +102,17 @@ public:
void
registerDataTypeDomainIPv4AndIPv6
(
DataTypeFactory
&
factory
)
{
factory
.
registerDataTypeDomain
(
"IPv4"
,
[]
{
return
std
::
make_pair
(
DataTypeFactory
::
instance
().
get
(
"UInt32"
),
std
::
make_unique
<
DataTypeDomainIPv4
>
());
});
factory
.
registerDataTypeDomain
(
"IPv6"
,
[]
{
return
std
::
make_pair
(
DataTypeFactory
::
instance
().
get
(
"FixedString(16)"
),
std
::
make_unique
<
DataTypeDomainIPv6
>
());
});
factory
.
registerSimpleDataTypeCustom
(
"IPv4"
,
[]
{
return
std
::
make_pair
(
DataTypeFactory
::
instance
().
get
(
"UInt32"
),
std
::
make_unique
<
DataTypeCustomDesc
>
(
std
::
make_unique
<
DataTypeCustomFixedName
>
(
"IPv4"
),
std
::
make_unique
<
DataTypeCustomIPv4Serialization
>
()));
});
factory
.
registerSimpleDataTypeCustom
(
"IPv6"
,
[]
{
return
std
::
make_pair
(
DataTypeFactory
::
instance
().
get
(
"FixedString(16)"
),
std
::
make_unique
<
DataTypeCustomDesc
>
(
std
::
make_unique
<
DataTypeCustomFixedName
>
(
"IPv6"
),
std
::
make_unique
<
DataTypeCustomIPv6Serialization
>
()));
});
}
}
// namespace DB
dbms/src/DataTypes/DataType
Domain
SimpleAggregateFunction.cpp
→
dbms/src/DataTypes/DataType
Custom
SimpleAggregateFunction.cpp
浏览文件 @
42b07c5e
...
...
@@ -5,7 +5,7 @@
#include <Columns/ColumnAggregateFunction.h>
#include <DataTypes/DataType
Domain
SimpleAggregateFunction.h>
#include <DataTypes/DataType
Custom
SimpleAggregateFunction.h>
#include <DataTypes/DataTypeLowCardinality.h>
#include <DataTypes/DataTypeTuple.h>
#include <DataTypes/DataTypeArray.h>
...
...
@@ -33,7 +33,7 @@ namespace ErrorCodes
static
const
std
::
vector
<
String
>
supported_functions
{
"any"
,
"anyLast"
,
"min"
,
"max"
,
"sum"
};
String
DataType
DomainSimpleAggregateFunction
::
doG
etName
()
const
String
DataType
CustomSimpleAggregateFunction
::
g
etName
()
const
{
std
::
stringstream
stream
;
stream
<<
"SimpleAggregateFunction("
<<
function
->
getName
();
...
...
@@ -58,7 +58,7 @@ String DataTypeDomainSimpleAggregateFunction::doGetName() const
}
static
std
::
pair
<
DataTypePtr
,
DataType
Domain
Ptr
>
create
(
const
ASTPtr
&
arguments
)
static
std
::
pair
<
DataTypePtr
,
DataType
CustomDesc
Ptr
>
create
(
const
ASTPtr
&
arguments
)
{
String
function_name
;
AggregateFunctionPtr
function
;
...
...
@@ -117,7 +117,6 @@ static std::pair<DataTypePtr, DataTypeDomainPtr> create(const ASTPtr & arguments
}
DataTypePtr
storage_type
=
DataTypeFactory
::
instance
().
get
(
argument_types
[
0
]
->
getName
());
DataTypeDomainPtr
domain
=
std
::
make_unique
<
DataTypeDomainSimpleAggregateFunction
>
(
function
,
argument_types
,
params_row
);
if
(
!
function
->
getReturnType
()
->
equals
(
*
removeLowCardinality
(
storage_type
)))
{
...
...
@@ -125,32 +124,14 @@ static std::pair<DataTypePtr, DataTypeDomainPtr> create(const ASTPtr & arguments
ErrorCodes
::
BAD_ARGUMENTS
);
}
return
std
::
make_pair
(
storage_type
,
std
::
move
(
domain
));
}
static
const
DataTypeDomainSimpleAggregateFunction
*
findSimpleAggregateFunction
(
const
IDataTypeDomain
*
domain
)
{
if
(
domain
==
nullptr
)
return
nullptr
;
if
(
auto
simple_aggr
=
dynamic_cast
<
const
DataTypeDomainSimpleAggregateFunction
*>
(
domain
))
return
simple_aggr
;
if
(
domain
->
getDomain
()
!=
nullptr
)
return
findSimpleAggregateFunction
(
domain
->
getDomain
());
DataTypeCustomNamePtr
custom_name
=
std
::
make_unique
<
DataTypeCustomSimpleAggregateFunction
>
(
function
,
argument_types
,
params_row
);
return
nullptr
;
return
std
::
make_pair
(
storage_type
,
std
::
make_unique
<
DataTypeCustomDesc
>
(
std
::
move
(
custom_name
),
nullptr
))
;
}
const
DataTypeDomainSimpleAggregateFunction
*
findSimpleAggregateFunction
(
DataTypePtr
dataType
)
{
return
findSimpleAggregateFunction
(
dataType
->
getDomain
());
}
void
registerDataTypeDomainSimpleAggregateFunction
(
DataTypeFactory
&
factory
)
{
factory
.
registerDataType
Domain
(
"SimpleAggregateFunction"
,
create
);
factory
.
registerDataType
Custom
(
"SimpleAggregateFunction"
,
create
);
}
}
dbms/src/DataTypes/DataType
Domain
SimpleAggregateFunction.h
→
dbms/src/DataTypes/DataType
Custom
SimpleAggregateFunction.h
浏览文件 @
42b07c5e
#pragma once
#include <DataTypes/
IDataTypeDomain
.h>
#include <DataTypes/
DataTypeCustom
.h>
#include <AggregateFunctions/IAggregateFunction.h>
#include <Common/FieldVisitors.h>
...
...
@@ -21,10 +21,10 @@ namespace DB
* SimpleAggregateFunction(anyLast, LowCardinality(Nullable(String)))
* SimpleAggregateFunction(anyLast, IPv4)
*
* Technically, a standard IDataType is instanciated and
a DataTypeDomainSimpleAggregateFunction is added as domain
.
* Technically, a standard IDataType is instanciated and
customized with IDataTypeCustomName and DataTypeCustomDesc
.
*/
class
DataType
DomainSimpleAggregateFunction
:
public
IDataTypeDomain
class
DataType
CustomSimpleAggregateFunction
:
public
IDataTypeCustomName
{
private:
const
AggregateFunctionPtr
function
;
...
...
@@ -32,14 +32,11 @@ private:
const
Array
parameters
;
public:
DataType
Domain
SimpleAggregateFunction
(
const
AggregateFunctionPtr
&
function_
,
const
DataTypes
&
argument_types_
,
const
Array
&
parameters_
)
DataType
Custom
SimpleAggregateFunction
(
const
AggregateFunctionPtr
&
function_
,
const
DataTypes
&
argument_types_
,
const
Array
&
parameters_
)
:
function
(
function_
),
argument_types
(
argument_types_
),
parameters
(
parameters_
)
{}
const
AggregateFunctionPtr
getFunction
()
const
{
return
function
;
}
String
doG
etName
()
const
override
;
String
g
etName
()
const
override
;
};
/// recursively follow data type domain to find a DataTypeDomainSimpleAggregateFunction
const
DataTypeDomainSimpleAggregateFunction
*
findSimpleAggregateFunction
(
DataTypePtr
dataType
);
}
dbms/src/DataTypes/DataType
DomainWithSimple
Serialization.cpp
→
dbms/src/DataTypes/DataType
CustomSimpleText
Serialization.cpp
浏览文件 @
42b07c5e
#include <DataTypes/DataType
DomainWithSimple
Serialization.h>
#include <DataTypes/DataType
CustomSimpleText
Serialization.h>
#include <IO/ReadBufferFromString.h>
#include <IO/ReadHelpers.h>
...
...
@@ -9,7 +9,7 @@ namespace
{
using
namespace
DB
;
static
String
serializeToString
(
const
DataType
DomainWithSimple
Serialization
&
domain
,
const
IColumn
&
column
,
size_t
row_num
,
const
FormatSettings
&
settings
)
static
String
serializeToString
(
const
DataType
CustomSimpleText
Serialization
&
domain
,
const
IColumn
&
column
,
size_t
row_num
,
const
FormatSettings
&
settings
)
{
WriteBufferFromOwnString
buffer
;
domain
.
serializeText
(
column
,
row_num
,
buffer
,
settings
);
...
...
@@ -17,7 +17,7 @@ static String serializeToString(const DataTypeDomainWithSimpleSerialization & do
return
buffer
.
str
();
}
static
void
deserializeFromString
(
const
DataType
DomainWithSimple
Serialization
&
domain
,
IColumn
&
column
,
const
String
&
s
,
const
FormatSettings
&
settings
)
static
void
deserializeFromString
(
const
DataType
CustomSimpleText
Serialization
&
domain
,
IColumn
&
column
,
const
String
&
s
,
const
FormatSettings
&
settings
)
{
ReadBufferFromString
istr
(
s
);
domain
.
deserializeText
(
column
,
istr
,
settings
);
...
...
@@ -28,59 +28,59 @@ static void deserializeFromString(const DataTypeDomainWithSimpleSerialization &
namespace
DB
{
DataType
DomainWithSimpleSerialization
::~
DataTypeDomainWithSimple
Serialization
()
DataType
CustomSimpleTextSerialization
::~
DataTypeCustomSimpleText
Serialization
()
{
}
void
DataType
DomainWithSimple
Serialization
::
serializeTextEscaped
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
serializeTextEscaped
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
writeEscapedString
(
serializeToString
(
*
this
,
column
,
row_num
,
settings
),
ostr
);
}
void
DataType
DomainWithSimple
Serialization
::
deserializeTextEscaped
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
deserializeTextEscaped
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
String
str
;
readEscapedString
(
str
,
istr
);
deserializeFromString
(
*
this
,
column
,
str
,
settings
);
}
void
DataType
DomainWithSimple
Serialization
::
serializeTextQuoted
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
serializeTextQuoted
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
writeQuotedString
(
serializeToString
(
*
this
,
column
,
row_num
,
settings
),
ostr
);
}
void
DataType
DomainWithSimple
Serialization
::
deserializeTextQuoted
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
deserializeTextQuoted
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
String
str
;
readQuotedString
(
str
,
istr
);
deserializeFromString
(
*
this
,
column
,
str
,
settings
);
}
void
DataType
DomainWithSimple
Serialization
::
serializeTextCSV
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
serializeTextCSV
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
writeCSVString
(
serializeToString
(
*
this
,
column
,
row_num
,
settings
),
ostr
);
}
void
DataType
DomainWithSimple
Serialization
::
deserializeTextCSV
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
deserializeTextCSV
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
String
str
;
readCSVString
(
str
,
istr
,
settings
.
csv
);
deserializeFromString
(
*
this
,
column
,
str
,
settings
);
}
void
DataType
DomainWithSimple
Serialization
::
serializeTextJSON
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
serializeTextJSON
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
writeJSONString
(
serializeToString
(
*
this
,
column
,
row_num
,
settings
),
ostr
,
settings
);
}
void
DataType
DomainWithSimple
Serialization
::
deserializeTextJSON
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
deserializeTextJSON
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
String
str
;
readJSONString
(
str
,
istr
);
deserializeFromString
(
*
this
,
column
,
str
,
settings
);
}
void
DataType
DomainWithSimple
Serialization
::
serializeTextXML
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
void
DataType
CustomSimpleText
Serialization
::
serializeTextXML
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
writeXMLString
(
serializeToString
(
*
this
,
column
,
row_num
,
settings
),
ostr
);
}
...
...
dbms/src/DataTypes/DataType
DomainWithSimple
Serialization.h
→
dbms/src/DataTypes/DataType
CustomSimpleText
Serialization.h
浏览文件 @
42b07c5e
#pragma once
#include <DataTypes/
IDataTypeDomain
.h>
#include <DataTypes/
DataTypeCustom
.h>
namespace
DB
{
...
...
@@ -10,12 +10,12 @@ class WriteBuffer;
struct
FormatSettings
;
class
IColumn
;
/** Simple
DataTypeDomai
n that uses serializeText/deserializeText
/** Simple
IDataTypeCustomTextSerializatio
n that uses serializeText/deserializeText
* for all serialization and deserialization. */
class
DataType
DomainWithSimpleSerialization
:
public
IDataTypeDomainCustom
Serialization
class
DataType
CustomSimpleTextSerialization
:
public
IDataTypeCustomText
Serialization
{
public:
virtual
~
DataType
DomainWithSimple
Serialization
()
override
;
virtual
~
DataType
CustomSimpleText
Serialization
()
override
;
// Methods that subclasses must override in order to get full serialization/deserialization support.
virtual
void
serializeText
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
)
const
override
=
0
;
...
...
dbms/src/DataTypes/DataTypeFactory.cpp
浏览文件 @
42b07c5e
#include <DataTypes/DataTypeFactory.h>
#include <DataTypes/
IDataTypeDomain
.h>
#include <DataTypes/
DataTypeCustom
.h>
#include <Parsers/parseQuery.h>
#include <Parsers/ParserCreateQuery.h>
#include <Parsers/ASTFunction.h>
...
...
@@ -115,20 +115,20 @@ void DataTypeFactory::registerSimpleDataType(const String & name, SimpleCreator
},
case_sensitiveness
);
}
void
DataTypeFactory
::
registerDataType
Domain
(
const
String
&
family_name
,
CreatorWithDomain
creator
,
CaseSensitiveness
case_sensitiveness
)
void
DataTypeFactory
::
registerDataType
Custom
(
const
String
&
family_name
,
CreatorWithCustom
creator
,
CaseSensitiveness
case_sensitiveness
)
{
registerDataType
(
family_name
,
[
creator
](
const
ASTPtr
&
ast
)
{
auto
res
=
creator
(
ast
);
res
.
first
->
appendDomai
n
(
std
::
move
(
res
.
second
));
res
.
first
->
setCustomizatio
n
(
std
::
move
(
res
.
second
));
return
res
.
first
;
},
case_sensitiveness
);
}
void
DataTypeFactory
::
register
DataTypeDomain
(
const
String
&
name
,
SimpleCreatorWithDomain
creator
,
CaseSensitiveness
case_sensitiveness
)
void
DataTypeFactory
::
register
SimpleDataTypeCustom
(
const
String
&
name
,
SimpleCreatorWithCustom
creator
,
CaseSensitiveness
case_sensitiveness
)
{
registerDataType
Domain
(
name
,
[
creator
](
const
ASTPtr
&
/*ast*/
)
registerDataType
Custom
(
name
,
[
creator
](
const
ASTPtr
&
/*ast*/
)
{
return
creator
();
},
case_sensitiveness
);
...
...
dbms/src/DataTypes/DataTypeFactory.h
浏览文件 @
42b07c5e
...
...
@@ -17,9 +17,6 @@ namespace DB
class
IDataType
;
using
DataTypePtr
=
std
::
shared_ptr
<
const
IDataType
>
;
class
IDataTypeDomain
;
using
DataTypeDomainPtr
=
std
::
unique_ptr
<
const
IDataTypeDomain
>
;
/** Creates a data type by name of data type family and parameters.
*/
...
...
@@ -28,8 +25,8 @@ class DataTypeFactory final : public ext::singleton<DataTypeFactory>, public IFa
private:
using
SimpleCreator
=
std
::
function
<
DataTypePtr
()
>
;
using
DataTypesDictionary
=
std
::
unordered_map
<
String
,
Creator
>
;
using
CreatorWith
Domain
=
std
::
function
<
std
::
pair
<
DataTypePtr
,
DataTypeDomain
Ptr
>
(
const
ASTPtr
&
parameters
)
>
;
using
SimpleCreatorWith
Domain
=
std
::
function
<
std
::
pair
<
DataTypePtr
,
DataTypeDomain
Ptr
>
()
>
;
using
CreatorWith
Custom
=
std
::
function
<
std
::
pair
<
DataTypePtr
,
DataTypeCustomDesc
Ptr
>
(
const
ASTPtr
&
parameters
)
>
;
using
SimpleCreatorWith
Custom
=
std
::
function
<
std
::
pair
<
DataTypePtr
,
DataTypeCustomDesc
Ptr
>
()
>
;
public:
DataTypePtr
get
(
const
String
&
full_name
)
const
;
...
...
@@ -42,11 +39,11 @@ public:
/// Register a simple data type, that have no parameters.
void
registerSimpleDataType
(
const
String
&
name
,
SimpleCreator
creator
,
CaseSensitiveness
case_sensitiveness
=
CaseSensitive
);
/// Register a
type family with a dynamic domain
void
registerDataType
Domain
(
const
String
&
family_name
,
CreatorWithDomain
creator
,
CaseSensitiveness
case_sensitiveness
=
CaseSensitive
);
/// Register a
customized type family
void
registerDataType
Custom
(
const
String
&
family_name
,
CreatorWithCustom
creator
,
CaseSensitiveness
case_sensitiveness
=
CaseSensitive
);
/// Register a simple
data type domain
void
register
DataTypeDomain
(
const
String
&
name
,
SimpleCreatorWithDomain
creator
,
CaseSensitiveness
case_sensitiveness
=
CaseSensitive
);
/// Register a simple
customized data type
void
register
SimpleDataTypeCustom
(
const
String
&
name
,
SimpleCreatorWithCustom
creator
,
CaseSensitiveness
case_sensitiveness
=
CaseSensitive
);
private:
const
Creator
&
findCreatorByName
(
const
String
&
family_name
)
const
;
...
...
dbms/src/DataTypes/IDataType.cpp
浏览文件 @
42b07c5e
...
...
@@ -9,7 +9,7 @@
#include <IO/WriteHelpers.h>
#include <DataTypes/IDataType.h>
#include <DataTypes/
IDataTypeDomain
.h>
#include <DataTypes/
DataTypeCustom
.h>
#include <DataTypes/NestedUtils.h>
...
...
@@ -23,8 +23,7 @@ namespace ErrorCodes
extern
const
int
DATA_TYPE_CANNOT_BE_PROMOTED
;
}
IDataType
::
IDataType
()
:
domain
(
nullptr
)
IDataType
::
IDataType
()
:
custom_name
(
nullptr
),
custom_text_serialization
(
nullptr
)
{
}
...
...
@@ -34,9 +33,9 @@ IDataType::~IDataType()
String
IDataType
::
getName
()
const
{
if
(
domain
)
if
(
custom_name
)
{
return
domain
->
getName
();
return
custom_name
->
getName
();
}
else
{
...
...
@@ -142,9 +141,9 @@ void IDataType::insertDefaultInto(IColumn & column) const
void
IDataType
::
serializeAsTextEscaped
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
serializeTextEscaped
(
column
,
row_num
,
ostr
,
settings
);
custom_text_serializatio
n
->
serializeTextEscaped
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -154,9 +153,9 @@ void IDataType::serializeAsTextEscaped(const IColumn & column, size_t row_num, W
void
IDataType
::
deserializeAsTextEscaped
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
deserializeTextEscaped
(
column
,
istr
,
settings
);
custom_text_serializatio
n
->
deserializeTextEscaped
(
column
,
istr
,
settings
);
}
else
{
...
...
@@ -166,9 +165,9 @@ void IDataType::deserializeAsTextEscaped(IColumn & column, ReadBuffer & istr, co
void
IDataType
::
serializeAsTextQuoted
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
serializeTextQuoted
(
column
,
row_num
,
ostr
,
settings
);
custom_text_serializatio
n
->
serializeTextQuoted
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -178,9 +177,9 @@ void IDataType::serializeAsTextQuoted(const IColumn & column, size_t row_num, Wr
void
IDataType
::
deserializeAsTextQuoted
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
deserializeTextQuoted
(
column
,
istr
,
settings
);
custom_text_serializatio
n
->
deserializeTextQuoted
(
column
,
istr
,
settings
);
}
else
{
...
...
@@ -190,9 +189,9 @@ void IDataType::deserializeAsTextQuoted(IColumn & column, ReadBuffer & istr, con
void
IDataType
::
serializeAsTextCSV
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
{
ser_domai
n
->
serializeTextCSV
(
column
,
row_num
,
ostr
,
settings
);
if
(
custom_text_serialization
)
{
custom_text_serializatio
n
->
serializeTextCSV
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -202,9 +201,9 @@ void IDataType::serializeAsTextCSV(const IColumn & column, size_t row_num, Write
void
IDataType
::
deserializeAsTextCSV
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
deserializeTextCSV
(
column
,
istr
,
settings
);
custom_text_serializatio
n
->
deserializeTextCSV
(
column
,
istr
,
settings
);
}
else
{
...
...
@@ -214,9 +213,9 @@ void IDataType::deserializeAsTextCSV(IColumn & column, ReadBuffer & istr, const
void
IDataType
::
serializeAsText
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
serializeText
(
column
,
row_num
,
ostr
,
settings
);
custom_text_serializatio
n
->
serializeText
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -226,9 +225,9 @@ void IDataType::serializeAsText(const IColumn & column, size_t row_num, WriteBuf
void
IDataType
::
serializeAsTextJSON
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
serializeTextJSON
(
column
,
row_num
,
ostr
,
settings
);
custom_text_serializatio
n
->
serializeTextJSON
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -238,9 +237,9 @@ void IDataType::serializeAsTextJSON(const IColumn & column, size_t row_num, Writ
void
IDataType
::
deserializeAsTextJSON
(
IColumn
&
column
,
ReadBuffer
&
istr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
deserializeTextJSON
(
column
,
istr
,
settings
);
custom_text_serializatio
n
->
deserializeTextJSON
(
column
,
istr
,
settings
);
}
else
{
...
...
@@ -250,9 +249,9 @@ void IDataType::deserializeAsTextJSON(IColumn & column, ReadBuffer & istr, const
void
IDataType
::
serializeAsTextXML
(
const
IColumn
&
column
,
size_t
row_num
,
WriteBuffer
&
ostr
,
const
FormatSettings
&
settings
)
const
{
if
(
auto
ser_domain
=
dynamic_cast
<
const
IDataTypeDomainCustomSerialization
*>
(
domain
.
get
())
)
if
(
custom_text_serialization
)
{
ser_domai
n
->
serializeTextXML
(
column
,
row_num
,
ostr
,
settings
);
custom_text_serializatio
n
->
serializeTextXML
(
column
,
row_num
,
ostr
,
settings
);
}
else
{
...
...
@@ -260,12 +259,14 @@ void IDataType::serializeAsTextXML(const IColumn & column, size_t row_num, Write
}
}
void
IDataType
::
appendDomain
(
DataTypeDomainPtr
new_domain
)
const
void
IDataType
::
setCustomization
(
DataTypeCustomDescPtr
custom_desc_
)
const
{
if
(
domain
==
nullptr
)
domain
=
std
::
move
(
new_domain
);
else
domain
->
appendDomain
(
std
::
move
(
new_domain
));
/// replace only if not null
if
(
custom_desc_
->
name
)
custom_name
=
std
::
move
(
custom_desc_
->
name
);
if
(
custom_desc_
->
text_serialization
)
custom_text_serialization
=
std
::
move
(
custom_desc_
->
text_serialization
);
}
}
dbms/src/DataTypes/IDataType.h
浏览文件 @
42b07c5e
...
...
@@ -4,6 +4,7 @@
#include <Common/COWPtr.h>
#include <boost/noncopyable.hpp>
#include <Core/Field.h>
#include <DataTypes/DataTypeCustom.h>
namespace
DB
...
...
@@ -12,9 +13,6 @@ namespace DB
class
ReadBuffer
;
class
WriteBuffer
;
class
IDataTypeDomain
;
using
DataTypeDomainPtr
=
std
::
unique_ptr
<
const
IDataTypeDomain
>
;
class
IDataType
;
struct
FormatSettings
;
...
...
@@ -461,19 +459,19 @@ public:
private:
friend
class
DataTypeFactory
;
/** Sets domain on existing DataType or append it to existing domain, can be considered as second phase
* of construction explicitly done by DataTypeFactory.
/** Customize this DataType
*/
void
appendDomain
(
DataTypeDomainPtr
new_domain
)
const
;
void
setCustomization
(
DataTypeCustomDescPtr
custom_desc_
)
const
;
private:
/** This is mutable to allow setting domain on `const IDataType` post construction,
* simplifying creation of domains for all types, without them even knowing
* of domain existence.
/** This is mutable to allow setting custom name and serialization on `const IDataType` post construction.
*/
mutable
DataTypeDomainPtr
domain
;
mutable
DataTypeCustomNamePtr
custom_name
;
mutable
DataTypeCustomTextSerializationPtr
custom_text_serialization
;
public:
const
IDataTypeDomain
*
getDomain
()
const
{
return
domain
.
get
();
}
const
IDataTypeCustomName
*
getCustomName
()
const
{
return
custom_name
.
get
();
}
const
IDataTypeCustomTextSerialization
*
getCustomTextSerialization
()
const
{
return
custom_text_serialization
.
get
();
}
};
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录