From abc33275ce4654191918f310869ff3759c790167 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Wed, 27 Apr 2022 15:30:09 +0700 Subject: [PATCH 1/4] Support Date32 data type. --- clickhouse/columns/date.cpp | 57 ++++++++++++++++++++++++++++++++ clickhouse/columns/date.h | 43 ++++++++++++++++++++++++ clickhouse/columns/factory.cpp | 2 ++ clickhouse/types/type_parser.cpp | 1 + clickhouse/types/types.cpp | 7 ++++ clickhouse/types/types.h | 3 ++ 6 files changed, 113 insertions(+) diff --git a/clickhouse/columns/date.cpp b/clickhouse/columns/date.cpp index 78a86be1..8e921c6d 100644 --- a/clickhouse/columns/date.cpp +++ b/clickhouse/columns/date.cpp @@ -59,6 +59,63 @@ ItemView ColumnDate::GetItem(size_t index) const { +ColumnDate32::ColumnDate32() + : Column(Type::CreateDate32()) + , data_(std::make_shared()) +{ +} + +void ColumnDate32::Append(const std::time_t& value) { + /// TODO: This code is fundamentally wrong. + data_->Append(static_cast(value / std::time_t(86400))); +} + +void ColumnDate32::Clear() { + data_->Clear(); +} + +std::time_t ColumnDate32::At(size_t n) const { + return static_cast(data_->At(n)) * 86400; +} + +void ColumnDate32::Append(ColumnRef column) { + if (auto col = column->As()) { + data_->Append(col->data_); + } +} + +bool ColumnDate32::Load(InputStream* input, size_t rows) { + return data_->Load(input, rows); +} + +void ColumnDate32::Save(OutputStream* output) { + data_->Save(output); +} + +size_t ColumnDate32::Size() const { + return data_->Size(); +} + +ColumnRef ColumnDate32::Slice(size_t begin, size_t len) const { + auto col = data_->Slice(begin, len)->As(); + auto result = std::make_shared(); + + result->data_->Append(col); + + return result; +} + +void ColumnDate32::Swap(Column& other) { + auto & col = dynamic_cast(other); + data_.swap(col.data_); +} + +ItemView ColumnDate32::GetItem(size_t index) const { + return data_->GetItem(index); +} + + + ColumnDateTime::ColumnDateTime() : Column(Type::CreateDateTime()) , data_(std::make_shared()) diff --git a/clickhouse/columns/date.h b/clickhouse/columns/date.h index 62ca4e05..a3937876 100644 --- a/clickhouse/columns/date.h +++ b/clickhouse/columns/date.h @@ -48,6 +48,49 @@ class ColumnDate : public Column { std::shared_ptr data_; }; + +/** */ +class ColumnDate32 : public Column { +public: + using ValueType = std::time_t; + + ColumnDate32(); + + /// Appends one element to the end of column. + /// TODO: The implementation is fundamentally wrong. + void Append(const std::time_t& value); + + /// Returns element at given row number. + /// TODO: The implementation is fundamentally wrong. + std::time_t At(size_t n) const; + + /// Appends content of given column to the end of current one. + void Append(ColumnRef column) override; + + /// Loads column data from input stream. + bool Load(InputStream* input, size_t rows) override; + + /// Saves column data to output stream. + void Save(OutputStream* output) override; + + /// Clear column data . + void Clear() override; + + /// Returns count of rows in the column. + size_t Size() const override; + + /// Makes slice of the current column. + ColumnRef Slice(size_t begin, size_t len) const override; + + void Swap(Column& other) override; + + ItemView GetItem(size_t index) const override; + +private: + std::shared_ptr data_; +}; + + /** */ class ColumnDateTime : public Column { public: diff --git a/clickhouse/columns/factory.cpp b/clickhouse/columns/factory.cpp index 264d2933..471488ce 100644 --- a/clickhouse/columns/factory.cpp +++ b/clickhouse/columns/factory.cpp @@ -85,6 +85,8 @@ static ColumnRef CreateTerminalColumn(const TypeAst& ast) { } case Type::Date: return std::make_shared(); + case Type::Date32: + return std::make_shared(); case Type::IPv4: return std::make_shared(); diff --git a/clickhouse/types/type_parser.cpp b/clickhouse/types/type_parser.cpp index 185a59c8..36bd9271 100644 --- a/clickhouse/types/type_parser.cpp +++ b/clickhouse/types/type_parser.cpp @@ -32,6 +32,7 @@ static const std::unordered_map kTypeCode = { { "DateTime", Type::DateTime }, { "DateTime64", Type::DateTime64 }, { "Date", Type::Date }, + { "Date32", Type::Date32 }, { "Array", Type::Array }, { "Nullable", Type::Nullable }, { "Tuple", Type::Tuple }, diff --git a/clickhouse/types/types.cpp b/clickhouse/types/types.cpp index 8dc6688b..073f235c 100644 --- a/clickhouse/types/types.cpp +++ b/clickhouse/types/types.cpp @@ -57,6 +57,8 @@ std::string Type::GetName() const { return As()->GetName(); case Date: return "Date"; + case Date32: + return "Date32"; case Array: return As()->GetName(); case Nullable: @@ -101,6 +103,7 @@ uint64_t Type::GetTypeUniqueId() const { case IPv4: case IPv6: case Date: + case Date32: // For simple types, unique ID is the same as Type::Code return code_; @@ -143,6 +146,10 @@ TypeRef Type::CreateDate() { return TypeRef(new Type(Type::Date)); } +TypeRef Type::CreateDate32() { + return TypeRef(new Type(Type::Date32)); +} + TypeRef Type::CreateDateTime(std::string timezone) { return TypeRef(new DateTimeType(std::move(timezone))); } diff --git a/clickhouse/types/types.h b/clickhouse/types/types.h index 173edd96..2e6e40e7 100644 --- a/clickhouse/types/types.h +++ b/clickhouse/types/types.h @@ -34,6 +34,7 @@ class Type { FixedString, DateTime, Date, + Date32, Array, Nullable, Tuple, @@ -88,6 +89,8 @@ class Type { static TypeRef CreateDate(); + static TypeRef CreateDate32(); + static TypeRef CreateDateTime(std::string timezone = std::string()); static TypeRef CreateDateTime64(size_t precision, std::string timezone = std::string()); From 63d15ac08e8e5fd0b09455806c3f9493cdc77575 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Wed, 4 May 2022 15:16:04 +0700 Subject: [PATCH 2/4] Move Date32 to the end of enum. --- clickhouse/types/types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clickhouse/types/types.h b/clickhouse/types/types.h index 2e6e40e7..8ca0d179 100644 --- a/clickhouse/types/types.h +++ b/clickhouse/types/types.h @@ -34,7 +34,6 @@ class Type { FixedString, DateTime, Date, - Date32, Array, Nullable, Tuple, @@ -50,6 +49,7 @@ class Type { Decimal128, LowCardinality, DateTime64, + Date32, }; using EnumItem = std::pair; From 97d908a261fa1391a6fc582edb1855ec866ce6ac Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Fri, 6 May 2022 11:14:09 +0700 Subject: [PATCH 3/4] Merge master and fix syntax error. --- clickhouse/columns/date.cpp | 15 +++++++++------ clickhouse/columns/date.h | 7 +++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/clickhouse/columns/date.cpp b/clickhouse/columns/date.cpp index 55ef5bfb..b4d549c5 100644 --- a/clickhouse/columns/date.cpp +++ b/clickhouse/columns/date.cpp @@ -88,12 +88,12 @@ void ColumnDate32::Append(ColumnRef column) { } } -bool ColumnDate32::Load(InputStream* input, size_t rows) { - return data_->Load(input, rows); +bool ColumnDate32::LoadBody(InputStream* input, size_t rows) { + return data_->LoadBody(input, rows); } -void ColumnDate32::Save(OutputStream* output) { - data_->Save(output); +void ColumnDate32::SaveBody(clickhouse/columns/date.cppOutputStream* output) { + data_->SaveBody(output); } size_t ColumnDate32::Size() const { @@ -101,7 +101,7 @@ size_t ColumnDate32::Size() const { } ColumnRef ColumnDate32::Slice(size_t begin, size_t len) const { - auto col = data_->Slice(begin, len)->As(); + auto col = data_->Slice(begin, len)->As(); auto result = std::make_shared(); result->data_->Append(col); @@ -109,6 +109,10 @@ ColumnRef ColumnDate32::Slice(size_t begin, size_t len) const { return result; } +ColumnRef ColumnDate32::CloneEmpty() const { + return std::make_shared(); +} + void ColumnDate32::Swap(Column& other) { auto & col = dynamic_cast(other); data_.swap(col.data_); @@ -119,7 +123,6 @@ ItemView ColumnDate32::GetItem(size_t index) const { } - ColumnDateTime::ColumnDateTime() : Column(Type::CreateDateTime()) , data_(std::make_shared()) diff --git a/clickhouse/columns/date.h b/clickhouse/columns/date.h index 53e5bad3..e99a3708 100644 --- a/clickhouse/columns/date.h +++ b/clickhouse/columns/date.h @@ -49,7 +49,6 @@ class ColumnDate : public Column { }; -/** */ class ColumnDate32 : public Column { public: using ValueType = std::time_t; @@ -68,10 +67,10 @@ class ColumnDate32 : public Column { void Append(ColumnRef column) override; /// Loads column data from input stream. - bool Load(InputStream* input, size_t rows) override; + bool LoadBody(InputStream* input, size_t rows) override; /// Saves column data to output stream. - void Save(OutputStream* output) override; + void SaveBody(OutputStream* output) override; /// Clear column data . void Clear() override; @@ -81,7 +80,7 @@ class ColumnDate32 : public Column { /// Makes slice of the current column. ColumnRef Slice(size_t begin, size_t len) const override; - + ColumnRef CloneEmpty() const override; void Swap(Column& other) override; ItemView GetItem(size_t index) const override; From 7342794e988e326ec72d13807c7fed40d4ffd438 Mon Sep 17 00:00:00 2001 From: Huy Pham Date: Fri, 6 May 2022 11:16:13 +0700 Subject: [PATCH 4/4] Fix syntax error. --- clickhouse/columns/date.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clickhouse/columns/date.cpp b/clickhouse/columns/date.cpp index b4d549c5..97be3f11 100644 --- a/clickhouse/columns/date.cpp +++ b/clickhouse/columns/date.cpp @@ -92,7 +92,7 @@ bool ColumnDate32::LoadBody(InputStream* input, size_t rows) { return data_->LoadBody(input, rows); } -void ColumnDate32::SaveBody(clickhouse/columns/date.cppOutputStream* output) { +void ColumnDate32::SaveBody(OutputStream* output) { data_->SaveBody(output); }