forked from ClickHouse/clickhouse-cpp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathblock.cpp
114 lines (86 loc) · 2.51 KB
/
block.cpp
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
#include "block.h"
#include "exceptions.h"
#include <stdexcept>
namespace clickhouse {
Block::Iterator::Iterator(const Block& block)
: block_(block)
, idx_(0)
{
}
Block::Iterator::Iterator(const Block& block, Block::Iterator::ConstructAtEndTag /*at_end*/)
: block_(block)
, idx_(block.GetColumnCount())
{}
const std::string& Block::Iterator::Name() const {
return block_.columns_[idx_].name;
}
TypeRef Block::Iterator::Type() const {
return block_.columns_[idx_].column->Type();
}
ColumnRef Block::Iterator::Column() const {
return block_.columns_[idx_].column;
}
bool Block::Iterator::Next() {
++idx_;
return IsValid();
}
bool Block::Iterator::IsValid() const {
return idx_ < block_.columns_.size();
}
Block::Block()
: rows_(0)
{
}
Block::Block(size_t cols, size_t rows)
: rows_(rows)
{
columns_.reserve(cols);
}
Block::~Block() = default;
void Block::AppendColumn(const std::string& name, const ColumnRef& col) {
if (columns_.empty()) {
rows_ = col->Size();
} else if (col->Size() != rows_) {
throw ValidationError("all columns in block must have same count of rows. Name: ["+name+"], rows: ["+std::to_string(rows_)+"], columns: [" + std::to_string(col->Size())+"]");
}
columns_.push_back(ColumnItem{name, col});
}
/// Count of columns in the block.
size_t Block::GetColumnCount() const {
return columns_.size();
}
const BlockInfo& Block::Info() const {
return info_;
}
/// Count of rows in the block.
size_t Block::GetRowCount() const {
return rows_;
}
size_t Block::RefreshRowCount()
{
size_t rows = 0UL;
for (size_t idx = 0UL; idx < columns_.size(); ++idx)
{
const std::string& name = columns_[idx].name;
const ColumnRef& col = columns_[idx].column;
if (idx == 0UL)
rows = col->Size();
else if (rows != col->Size())
throw ValidationError("all columns in block must have same count of rows. Name: ["+name+"], rows: ["+std::to_string(rows)+"], columns: [" + std::to_string(col->Size())+"]");
}
rows_ = rows;
return rows_;
}
ColumnRef Block::operator [] (size_t idx) const {
if (idx < columns_.size()) {
return columns_[idx].column;
}
throw std::out_of_range("column index is out of range. Index: ["+std::to_string(idx)+"], columns: [" + std::to_string(columns_.size())+"]");
}
Block::Iterator Block::begin() const {
return Iterator(*this);
}
Block::Iterator Block::end() const {
return Iterator(*this, Iterator::ConstructAtEndTag{});
}
}