diff --git a/clickhouse/columns/tuple.cpp b/clickhouse/columns/tuple.cpp index 301fcf94..d799d104 100644 --- a/clickhouse/columns/tuple.cpp +++ b/clickhouse/columns/tuple.cpp @@ -20,9 +20,29 @@ size_t ColumnTuple::TupleSize() const { return columns_.size(); } +void ColumnTuple::Append(ColumnRef column) { + if (!this->Type()->IsEqual(column->Type())) { + throw std::runtime_error( + "can't append column of type " + column->Type()->GetName() + " " + "to column type " + this->Type()->GetName()); + } + const auto & source_tuple_column = column->As(); + for (size_t ci = 0; ci < columns_.size(); ++ci) { + columns_[ci]->Append((*source_tuple_column)[ci]); + } +} size_t ColumnTuple::Size() const { return columns_.empty() ? 0 : columns_[0]->Size(); } +ColumnRef ColumnTuple::Slice(size_t begin, size_t len) const { + std::vector sliced_columns; + sliced_columns.reserve(columns_.size()); + for(const auto &column : columns_){ + sliced_columns.push_back(column->Slice(begin, len)); + } + + return std::make_shared(sliced_columns); +} bool ColumnTuple::Load(InputStream* input, size_t rows) { for (auto ci = columns_.begin(); ci != columns_.end(); ++ci) { diff --git a/clickhouse/columns/tuple.h b/clickhouse/columns/tuple.h index bf84d1b6..b1ac784a 100644 --- a/clickhouse/columns/tuple.h +++ b/clickhouse/columns/tuple.h @@ -22,7 +22,7 @@ class ColumnTuple : public Column { public: /// Appends content of given column to the end of current one. - void Append(ColumnRef) override { } + void Append(ColumnRef column) override; /// Loads column data from input stream. bool Load(InputStream* input, size_t rows) override; @@ -37,7 +37,7 @@ class ColumnTuple : public Column { size_t Size() const override; /// Makes slice of the current column. - ColumnRef Slice(size_t, size_t) const override { return ColumnRef(); } + ColumnRef Slice(size_t, size_t) const override; void Swap(Column& other) override; private: diff --git a/ut/columns_ut.cpp b/ut/columns_ut.cpp index 02983ba8..c8e3aa18 100644 --- a/ut/columns_ut.cpp +++ b/ut/columns_ut.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -219,6 +220,39 @@ TEST(ColumnsCase, ArrayAppend) { //ASSERT_EQ(col->As()->At(1), 3u); } +TEST(ColumnsCase, TupleAppend){ + auto tuple1 = std::make_shared(std::vector({ + std::make_shared(), + std::make_shared() + })); + auto tuple2 = std::make_shared(std::vector({ + std::make_shared(), + std::make_shared() + })); + (*tuple1)[0]->As()->Append(2u); + (*tuple1)[1]->As()->Append("2"); + tuple2->Append(tuple1); + + ASSERT_EQ((*tuple2)[0]->As()->At(0), 2u); + ASSERT_EQ((*tuple2)[1]->As()->At(0), "2"); +} + +TEST(ColumnsCase, TupleSlice){ + auto tuple1 = std::make_shared(std::vector({ + std::make_shared(), + std::make_shared() + })); + + (*tuple1)[0]->As()->Append(2u); + (*tuple1)[1]->As()->Append("2"); + (*tuple1)[0]->As()->Append(3u); + (*tuple1)[1]->As()->Append("3"); + auto tuple2 = tuple1->Slice(1,1)->As(); + + ASSERT_EQ((*tuple2)[0]->As()->At(0), 3u); + ASSERT_EQ((*tuple2)[1]->As()->At(0), "3"); +} + TEST(ColumnsCase, DateAppend) { auto col1 = std::make_shared(); auto col2 = std::make_shared();