From b3a63239ae1eb3eac732165af0e1fa7ef25ab15b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mollet?= Date: Wed, 15 Dec 2021 10:36:36 +0100 Subject: [PATCH 1/4] Implement Append for ColumnTuple --- clickhouse/columns/tuple.cpp | 10 ++++++++++ clickhouse/columns/tuple.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/clickhouse/columns/tuple.cpp b/clickhouse/columns/tuple.cpp index 301fcf94..1675cd81 100644 --- a/clickhouse/columns/tuple.cpp +++ b/clickhouse/columns/tuple.cpp @@ -20,6 +20,16 @@ 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()); + } + for (size_t ci = 0; ci < columns_.size(); ci++) { + columns_[ci]->Append((*column->As())[ci]); + } +} size_t ColumnTuple::Size() const { return columns_.empty() ? 0 : columns_[0]->Size(); } diff --git a/clickhouse/columns/tuple.h b/clickhouse/columns/tuple.h index bf84d1b6..0ef22934 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; From 551cd0437ea95567c380853474205bba8603b736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mollet?= Date: Tue, 21 Dec 2021 09:25:48 +0100 Subject: [PATCH 2/4] Implement Slice for ColumnTuple --- clickhouse/columns/tuple.cpp | 8 ++++++++ clickhouse/columns/tuple.h | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/clickhouse/columns/tuple.cpp b/clickhouse/columns/tuple.cpp index 1675cd81..a4f49a90 100644 --- a/clickhouse/columns/tuple.cpp +++ b/clickhouse/columns/tuple.cpp @@ -33,6 +33,14 @@ void ColumnTuple::Append(ColumnRef column) { size_t ColumnTuple::Size() const { return columns_.empty() ? 0 : columns_[0]->Size(); } +ColumnRef ColumnTuple::Slice(size_t begin, size_t len) const { + std::vector slicedColumns; + for(const auto &column : columns_){ + slicedColumns.push_back(column->Slice(begin, len)); + } + + return std::make_shared(slicedColumns); +} 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 0ef22934..b1ac784a 100644 --- a/clickhouse/columns/tuple.h +++ b/clickhouse/columns/tuple.h @@ -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: From 70034a23bf272c3729b3dd7ff69786a606543419 Mon Sep 17 00:00:00 2001 From: Vasily Nemkov Date: Tue, 18 Jan 2022 19:07:38 +0300 Subject: [PATCH 3/4] Minor optimization and style fixes --- clickhouse/columns/tuple.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/clickhouse/columns/tuple.cpp b/clickhouse/columns/tuple.cpp index a4f49a90..d799d104 100644 --- a/clickhouse/columns/tuple.cpp +++ b/clickhouse/columns/tuple.cpp @@ -26,20 +26,22 @@ void ColumnTuple::Append(ColumnRef column) { "can't append column of type " + column->Type()->GetName() + " " "to column type " + this->Type()->GetName()); } - for (size_t ci = 0; ci < columns_.size(); ci++) { - columns_[ci]->Append((*column->As())[ci]); + 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 slicedColumns; + std::vector sliced_columns; + sliced_columns.reserve(columns_.size()); for(const auto &column : columns_){ - slicedColumns.push_back(column->Slice(begin, len)); + sliced_columns.push_back(column->Slice(begin, len)); } - return std::make_shared(slicedColumns); + return std::make_shared(sliced_columns); } bool ColumnTuple::Load(InputStream* input, size_t rows) { From 2cbbeeed69c6d85e9cc5e17746cfa0e9ee6a7538 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timoth=C3=A9e=20Mollet?= Date: Thu, 20 Jan 2022 11:02:43 +0100 Subject: [PATCH 4/4] Add unit tests for slice and append for ColumnTuple --- ut/columns_ut.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) 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();