forked from ClickHouse/ClickHouse
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSerializationInfo.h
More file actions
130 lines (97 loc) · 4.4 KB
/
SerializationInfo.h
File metadata and controls
130 lines (97 loc) · 4.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#pragma once
#include <Core/Types_fwd.h>
#include <DataTypes/Serializations/ISerialization.h>
#include <DataTypes/Serializations/SerializationInfoSettings.h>
namespace Poco::JSON
{
class Object;
}
namespace DB
{
class ReadBuffer;
class ReadBuffer;
class WriteBuffer;
class NamesAndTypesList;
class Block;
constexpr auto SERIALIZATION_INFO_VERSION = 0;
/** Contains information about kind of serialization of column and its subcolumns.
* Also contains information about content of columns,
* that helps to choose kind of serialization of column.
*
* Currently has only information about number of default rows,
* that helps to choose sparse serialization.
*
* Should be extended, when new kinds of serialization will be implemented.
*/
class SerializationInfo
{
public:
using Settings = SerializationInfoSettings;
struct Data
{
size_t num_rows = 0;
size_t num_defaults = 0;
void add(const IColumn & column);
void add(const Data & other);
void remove(const Data & other);
void addDefaults(size_t length);
};
SerializationInfo(ISerialization::Kind kind_, const SerializationInfoSettings & settings_);
SerializationInfo(ISerialization::Kind kind_, const SerializationInfoSettings & settings_, const Data & data_);
virtual ~SerializationInfo() = default;
virtual bool hasCustomSerialization() const { return kind != ISerialization::Kind::DEFAULT; }
virtual bool structureEquals(const SerializationInfo & rhs) const { return typeid(SerializationInfo) == typeid(rhs); }
virtual void add(const IColumn & column);
virtual void add(const SerializationInfo & other);
virtual void remove(const SerializationInfo & other);
virtual void addDefaults(size_t length);
virtual void replaceData(const SerializationInfo & other);
virtual std::shared_ptr<SerializationInfo> clone() const;
virtual std::shared_ptr<SerializationInfo> createWithType(
const IDataType & old_type,
const IDataType & new_type,
const SerializationInfoSettings & new_settings) const;
virtual void serialializeKindBinary(WriteBuffer & out) const;
virtual void deserializeFromKindsBinary(ReadBuffer & in);
virtual void toJSON(Poco::JSON::Object & object) const;
virtual void fromJSON(const Poco::JSON::Object & object);
void setKind(ISerialization::Kind kind_) { kind = kind_; }
const SerializationInfoSettings & getSettings() const { return settings; }
const Data & getData() const { return data; }
ISerialization::Kind getKind() const { return kind; }
static ISerialization::Kind chooseKind(const Data & data, const SerializationInfoSettings & settings);
protected:
const SerializationInfoSettings settings;
ISerialization::Kind kind;
Data data;
};
using SerializationInfoPtr = std::shared_ptr<const SerializationInfo>;
using MutableSerializationInfoPtr = std::shared_ptr<SerializationInfo>;
using SerializationInfos = std::vector<SerializationInfoPtr>;
using MutableSerializationInfos = std::vector<MutableSerializationInfoPtr>;
/// The order is important because info is serialized to part metadata.
class SerializationInfoByName : public std::map<String, MutableSerializationInfoPtr>
{
public:
using Settings = SerializationInfoSettings;
SerializationInfoByName() = default;
SerializationInfoByName(const NamesAndTypesList & columns, const Settings & settings);
void add(const Block & block);
void add(const SerializationInfoByName & other);
void add(const String & name, const SerializationInfo & info);
void remove(const SerializationInfoByName & other);
void remove(const String & name, const SerializationInfo & info);
SerializationInfoPtr tryGet(const String & name) const;
MutableSerializationInfoPtr tryGet(const String & name);
ISerialization::Kind getKind(const String & column_name) const;
/// Takes data from @other, but keeps current serialization kinds.
/// If column exists in @other infos, but not in current infos,
/// it's cloned to current infos.
void replaceData(const SerializationInfoByName & other);
void writeJSON(WriteBuffer & out) const;
static SerializationInfoByName readJSON(
const NamesAndTypesList & columns, const Settings & settings, ReadBuffer & in);
static SerializationInfoByName readJSONFromString(
const NamesAndTypesList & columns, const Settings & settings, const std::string & str);
};
}