#include "enum.h" #include "utils.h" #include namespace NClickHouse { template TColumnEnum::TColumnEnum(TTypeRef type) : TColumn(type) { } template TColumnEnum::TColumnEnum(TTypeRef type, const TVector& data) : TColumn(type) , Data_(data) { } template <> TIntrusivePtr> TColumnEnum::Create(const TVector& enumItems) { TTypeRef type = TType::CreateEnum8(enumItems); return new TColumnEnum(type); } template <> TIntrusivePtr> TColumnEnum::Create( const TVector& enumItems, const TVector& values, bool checkValues) { TTypeRef type = TType::CreateEnum8(enumItems); if (checkValues) { for (i8 value : values) { Y_ENSURE(type->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value)); } } return new TColumnEnum(type, values); } template <> TIntrusivePtr> TColumnEnum::Create( const TVector& enumItems, const TVector& names) { TTypeRef type = TType::CreateEnum8(enumItems); TVector values; values.reserve(names.size()); for (const TString& name : names) { values.push_back(type->GetEnumValue(name)); } return new TColumnEnum(type, values); } template <> TIntrusivePtr> TColumnEnum::Create(const TVector& enumItems) { TTypeRef type = TType::CreateEnum16(enumItems); return new TColumnEnum(type); } template <> TIntrusivePtr> TColumnEnum::Create( const TVector& enumItems, const TVector& values, bool checkValues) { TTypeRef type = TType::CreateEnum16(enumItems); if (checkValues) { for (i16 value : values) { Y_ENSURE(type->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value)); } } return new TColumnEnum(type, values); } template <> TIntrusivePtr> TColumnEnum::Create( const TVector& enumItems, const TVector& names) { TTypeRef type = TType::CreateEnum16(enumItems); TVector values; values.reserve(names.size()); for (const TString& name : names) { values.push_back(type->GetEnumValue(name)); } return new TColumnEnum(type, values); } template void TColumnEnum::Append(const T& value, bool checkValue) { if (checkValue) { Y_ENSURE(Type_->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value)); } Data_.push_back(value); } template void TColumnEnum::Append(const TString& name) { Data_.push_back(Type_->GetEnumValue(name)); } template const T& TColumnEnum::At(size_t n) const { return Data_.at(n); } template const TString& TColumnEnum::NameAt(size_t n) const { return Type_->GetEnumName(Data_.at(n)); } template const T& TColumnEnum::operator[](size_t n) const { return Data_[n]; } template void TColumnEnum::SetAt(size_t n, const T& value, bool checkValue) { if (checkValue) { Y_ENSURE(Type_->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value)); } Data_.at(n) = value; } template void TColumnEnum::SetNameAt(size_t n, const TString& name) { Data_.at(n) = Type_->GetEnumValue(name); } template void TColumnEnum::Append(TColumnRef column) { if (auto col = column->As>()) { Data_.insert(Data_.end(), col->Data_.begin(), col->Data_.end()); } } template bool TColumnEnum::Load(TCodedInputStream* input, size_t rows) { Data_.resize(rows); return input->ReadRaw(Data_.data(), Data_.size() * sizeof(T)); } template void TColumnEnum::Save(TCodedOutputStream* output) { output->WriteRaw(Data_.data(), Data_.size() * sizeof(T)); } template size_t TColumnEnum::Size() const { return Data_.size(); } template TColumnRef TColumnEnum::Slice(size_t begin, size_t len) { return new TColumnEnum(Type_, SliceVector(Data_, begin, len)); } template class TColumnEnum; template class TColumnEnum; }