Skip to content

Commit 1ab8769

Browse files
authored
Merge pull request #126 from timoll/tuple-array
Implement Append for ColumnTuple
2 parents d3691ab + 2cbbeee commit 1ab8769

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

clickhouse/columns/tuple.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,29 @@ size_t ColumnTuple::TupleSize() const {
2020
return columns_.size();
2121
}
2222

23+
void ColumnTuple::Append(ColumnRef column) {
24+
if (!this->Type()->IsEqual(column->Type())) {
25+
throw std::runtime_error(
26+
"can't append column of type " + column->Type()->GetName() + " "
27+
"to column type " + this->Type()->GetName());
28+
}
29+
const auto & source_tuple_column = column->As<ColumnTuple>();
30+
for (size_t ci = 0; ci < columns_.size(); ++ci) {
31+
columns_[ci]->Append((*source_tuple_column)[ci]);
32+
}
33+
}
2334
size_t ColumnTuple::Size() const {
2435
return columns_.empty() ? 0 : columns_[0]->Size();
2536
}
37+
ColumnRef ColumnTuple::Slice(size_t begin, size_t len) const {
38+
std::vector<ColumnRef> sliced_columns;
39+
sliced_columns.reserve(columns_.size());
40+
for(const auto &column : columns_){
41+
sliced_columns.push_back(column->Slice(begin, len));
42+
}
43+
44+
return std::make_shared<ColumnTuple>(sliced_columns);
45+
}
2646

2747
bool ColumnTuple::Load(InputStream* input, size_t rows) {
2848
for (auto ci = columns_.begin(); ci != columns_.end(); ++ci) {

clickhouse/columns/tuple.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class ColumnTuple : public Column {
2222

2323
public:
2424
/// Appends content of given column to the end of current one.
25-
void Append(ColumnRef) override { }
25+
void Append(ColumnRef column) override;
2626

2727
/// Loads column data from input stream.
2828
bool Load(InputStream* input, size_t rows) override;
@@ -37,7 +37,7 @@ class ColumnTuple : public Column {
3737
size_t Size() const override;
3838

3939
/// Makes slice of the current column.
40-
ColumnRef Slice(size_t, size_t) const override { return ColumnRef(); }
40+
ColumnRef Slice(size_t, size_t) const override;
4141
void Swap(Column& other) override;
4242

4343
private:

ut/columns_ut.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <clickhouse/columns/array.h>
2+
#include <clickhouse/columns/tuple.h>
23
#include <clickhouse/columns/date.h>
34
#include <clickhouse/columns/enum.h>
45
#include <clickhouse/columns/factory.h>
@@ -219,6 +220,39 @@ TEST(ColumnsCase, ArrayAppend) {
219220
//ASSERT_EQ(col->As<ColumnUInt64>()->At(1), 3u);
220221
}
221222

223+
TEST(ColumnsCase, TupleAppend){
224+
auto tuple1 = std::make_shared<ColumnTuple>(std::vector<ColumnRef>({
225+
std::make_shared<ColumnUInt64>(),
226+
std::make_shared<ColumnString>()
227+
}));
228+
auto tuple2 = std::make_shared<ColumnTuple>(std::vector<ColumnRef>({
229+
std::make_shared<ColumnUInt64>(),
230+
std::make_shared<ColumnString>()
231+
}));
232+
(*tuple1)[0]->As<ColumnUInt64>()->Append(2u);
233+
(*tuple1)[1]->As<ColumnString>()->Append("2");
234+
tuple2->Append(tuple1);
235+
236+
ASSERT_EQ((*tuple2)[0]->As<ColumnUInt64>()->At(0), 2u);
237+
ASSERT_EQ((*tuple2)[1]->As<ColumnString>()->At(0), "2");
238+
}
239+
240+
TEST(ColumnsCase, TupleSlice){
241+
auto tuple1 = std::make_shared<ColumnTuple>(std::vector<ColumnRef>({
242+
std::make_shared<ColumnUInt64>(),
243+
std::make_shared<ColumnString>()
244+
}));
245+
246+
(*tuple1)[0]->As<ColumnUInt64>()->Append(2u);
247+
(*tuple1)[1]->As<ColumnString>()->Append("2");
248+
(*tuple1)[0]->As<ColumnUInt64>()->Append(3u);
249+
(*tuple1)[1]->As<ColumnString>()->Append("3");
250+
auto tuple2 = tuple1->Slice(1,1)->As<ColumnTuple>();
251+
252+
ASSERT_EQ((*tuple2)[0]->As<ColumnUInt64>()->At(0), 3u);
253+
ASSERT_EQ((*tuple2)[1]->As<ColumnString>()->At(0), "3");
254+
}
255+
222256
TEST(ColumnsCase, DateAppend) {
223257
auto col1 = std::make_shared<ColumnDate>();
224258
auto col2 = std::make_shared<ColumnDate>();

0 commit comments

Comments
 (0)