Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Array of low cardinality types serialization/deserialization #173

Merged
merged 10 commits into from
May 3, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions clickhouse/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ SET ( clickhouse-cpp-lib-src
base/wire_format.cpp

columns/array.cpp
columns/column.cpp
columns/date.cpp
columns/decimal.cpp
columns/enum.cpp
Expand Down
25 changes: 19 additions & 6 deletions clickhouse/columns/array.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,22 +54,34 @@ void ColumnArray::Append(ColumnRef column) {
}
}

bool ColumnArray::Load(InputStream* input, size_t rows) {
bool ColumnArray::LoadPrefix(InputStream* input, size_t rows) {
if (!rows) {
return true;
}
if (!offsets_->Load(input, rows)) {

return data_->LoadPrefix(input, rows);
}

bool ColumnArray::LoadBody(InputStream* input, size_t rows) {
if (!rows) {
return true;
}
if (!offsets_->LoadBody(input, rows)) {
return false;
}
if (!data_->Load(input, (*offsets_)[rows - 1])) {
if (!data_->LoadBody(input, (*offsets_)[rows - 1])) {
return false;
}
return true;
}

void ColumnArray::Save(OutputStream* output) {
offsets_->Save(output);
data_->Save(output);
void ColumnArray::SavePrefix(OutputStream* output) {
data_->SavePrefix(output);
}

void ColumnArray::SaveBody(OutputStream* output) {
offsets_->SaveBody(output);
data_->SaveBody(output);
}

void ColumnArray::Clear() {
Expand All @@ -92,6 +104,7 @@ void ColumnArray::OffsetsIncrease(size_t n) {
}

size_t ColumnArray::GetOffset(size_t n) const {

return (n == 0) ? 0 : (*offsets_)[n - 1];
}

Expand Down
10 changes: 8 additions & 2 deletions clickhouse/columns/array.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,17 @@ class ColumnArray : public Column {
/// Appends content of given column to the end of current one.
void Append(ColumnRef column) override;

/// Loads column prefix from input stream.
bool LoadPrefix(InputStream* input, size_t rows) 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 prefix to output stream.
void SavePrefix(OutputStream* output) override;

/// Saves column data to output stream.
void Save(OutputStream* output) override;
void SaveBody(OutputStream* output) override;
arthurpassos marked this conversation as resolved.
Show resolved Hide resolved

/// Clear column data .
void Clear() override;
Expand Down
24 changes: 24 additions & 0 deletions clickhouse/columns/column.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#include "column.h"

namespace clickhouse {

bool Column::LoadPrefix(InputStream*, size_t) {
/// does nothing by default
return true;
}

bool Column::Load(InputStream* input, size_t rows) {
return LoadPrefix(input, rows) && LoadBody(input, rows);
arthurpassos marked this conversation as resolved.
Show resolved Hide resolved
}

void Column::SavePrefix(OutputStream*) {
/// does nothing by default
}

/// Saves column data to output stream.
void Column::Save(OutputStream* output) {
SavePrefix(output);
arthurpassos marked this conversation as resolved.
Show resolved Hide resolved
SaveBody(output);
}

}
22 changes: 19 additions & 3 deletions clickhouse/columns/column.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,27 @@ class Column : public std::enable_shared_from_this<Column> {
/// Appends content of given column to the end of current one.
virtual void Append(ColumnRef column) = 0;

/// Template method to load column data from input stream. It'll call LoadPrefix and LoadBody.
/// Should be called only once from the client. Derived classes should not call it.
bool Load(InputStream* input, size_t rows);

/// Loads column prefix from input stream.
virtual bool LoadPrefix(InputStream* input, size_t rows);

/// Loads column data from input stream.
virtual bool Load(InputStream* input, size_t rows) = 0;
virtual bool LoadBody(InputStream* input, size_t rows) = 0;

/// Saves column prefix to output stream. Column types with prefixes must implement it.
virtual void SavePrefix(OutputStream* output);

/// Saves column body to output stream.
virtual void SaveBody(OutputStream* output) = 0;

/// Saves column data to output stream.
virtual void Save(OutputStream* output) = 0;
/// Template method to save to output stream. It'll call SavePrefix and SaveBody respectively
/// Should be called only once from the client. Derived classes should not call it.
/// Save is split in Prefix and Body because some data types require prefixes and specific serialization order.
/// For instance, Array(LowCardinality(X)) requires LowCardinality.key_version bytes to come before Array.offsets
void Save(OutputStream* output);

/// Clear column data .
virtual void Clear() = 0;
Expand Down
24 changes: 12 additions & 12 deletions clickhouse/columns/date.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,12 @@ void ColumnDate::Append(ColumnRef column) {
}
}

bool ColumnDate::Load(InputStream* input, size_t rows) {
return data_->Load(input, rows);
bool ColumnDate::LoadBody(InputStream* input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnDate::Save(OutputStream* output) {
data_->Save(output);
void ColumnDate::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

size_t ColumnDate::Size() const {
Expand Down Expand Up @@ -89,12 +89,12 @@ void ColumnDateTime::Append(ColumnRef column) {
}
}

bool ColumnDateTime::Load(InputStream* input, size_t rows) {
return data_->Load(input, rows);
bool ColumnDateTime::LoadBody(InputStream* input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnDateTime::Save(OutputStream* output) {
data_->Save(output);
void ColumnDateTime::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

size_t ColumnDateTime::Size() const {
Expand Down Expand Up @@ -162,12 +162,12 @@ void ColumnDateTime64::Append(ColumnRef column) {
}
}

bool ColumnDateTime64::Load(InputStream* input, size_t rows) {
return data_->Load(input, rows);
bool ColumnDateTime64::LoadBody(InputStream* input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnDateTime64::Save(OutputStream* output) {
data_->Save(output);
void ColumnDateTime64::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

void ColumnDateTime64::Clear() {
Expand Down
12 changes: 6 additions & 6 deletions clickhouse/columns/date.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ class ColumnDate : 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;
Expand Down Expand Up @@ -70,13 +70,13 @@ class ColumnDateTime : 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;

/// Clear column data .
void Clear() override;

/// Saves column data to output stream.
void Save(OutputStream* output) override;
void SaveBody(OutputStream* output) override;

/// Returns count of rows in the column.
size_t Size() const override;
Expand Down Expand Up @@ -118,13 +118,13 @@ class ColumnDateTime64 : 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;

/// Clear column data .
void Clear() override;

/// Saves column data to output stream.
void Save(OutputStream* output) override;
void SaveBody(OutputStream* output) override;

/// Returns count of rows in the column.
size_t Size() const override;
Expand Down
8 changes: 4 additions & 4 deletions clickhouse/columns/decimal.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,12 @@ void ColumnDecimal::Append(ColumnRef column) {
}
}

bool ColumnDecimal::Load(InputStream * input, size_t rows) {
return data_->Load(input, rows);
bool ColumnDecimal::LoadBody(InputStream * input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnDecimal::Save(OutputStream* output) {
data_->Save(output);
void ColumnDecimal::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

void ColumnDecimal::Clear() {
Expand Down
4 changes: 2 additions & 2 deletions clickhouse/columns/decimal.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ class ColumnDecimal : public Column {

public:
void Append(ColumnRef column) override;
bool Load(InputStream* input, size_t rows) override;
void Save(OutputStream* output) override;
bool LoadBody(InputStream* input, size_t rows) override;
void SaveBody(OutputStream* output) override;
void Clear() override;
size_t Size() const override;
ColumnRef Slice(size_t begin, size_t len) const override;
Expand Down
4 changes: 2 additions & 2 deletions clickhouse/columns/enum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,13 +74,13 @@ void ColumnEnum<T>::Append(ColumnRef column) {
}

template <typename T>
bool ColumnEnum<T>::Load(InputStream* input, size_t rows) {
bool ColumnEnum<T>::LoadBody(InputStream* input, size_t rows) {
data_.resize(rows);
return WireFormat::ReadBytes(*input, data_.data(), data_.size() * sizeof(T));
}

template <typename T>
void ColumnEnum<T>::Save(OutputStream* output) {
void ColumnEnum<T>::SaveBody(OutputStream* output) {
WireFormat::WriteBytes(*output, data_.data(), data_.size() * sizeof(T));
}

Expand Down
6 changes: 3 additions & 3 deletions clickhouse/columns/enum.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ class ColumnEnum : 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;

Expand Down
8 changes: 4 additions & 4 deletions clickhouse/columns/ip4.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,12 @@ void ColumnIPv4::Append(ColumnRef column) {
}
}

bool ColumnIPv4::Load(InputStream * input, size_t rows) {
return data_->Load(input, rows);
bool ColumnIPv4::LoadBody(InputStream * input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnIPv4::Save(OutputStream* output) {
data_->Save(output);
void ColumnIPv4::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

size_t ColumnIPv4::Size() const {
Expand Down
4 changes: 2 additions & 2 deletions clickhouse/columns/ip4.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ class ColumnIPv4 : 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;
Expand Down
8 changes: 4 additions & 4 deletions clickhouse/columns/ip6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,12 +71,12 @@ void ColumnIPv6::Append(ColumnRef column) {
}
}

bool ColumnIPv6::Load(InputStream* input, size_t rows) {
return data_->Load(input, rows);
bool ColumnIPv6::LoadBody(InputStream* input, size_t rows) {
return data_->LoadBody(input, rows);
}

void ColumnIPv6::Save(OutputStream* output) {
data_->Save(output);
void ColumnIPv6::SaveBody(OutputStream* output) {
data_->SaveBody(output);
}

size_t ColumnIPv6::Size() const {
Expand Down
4 changes: 2 additions & 2 deletions clickhouse/columns/ip6.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,10 @@ class ColumnIPv6 : 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;
Expand Down
Loading