enum.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "enum.h"
  2. #include "utils.h"
  3. #include <util/string/printf.h>
  4. namespace NClickHouse {
  5. template <typename T>
  6. TColumnEnum<T>::TColumnEnum(TTypeRef type)
  7. : TColumn(type)
  8. {
  9. }
  10. template <typename T>
  11. TColumnEnum<T>::TColumnEnum(TTypeRef type, const TVector<T>& data)
  12. : TColumn(type)
  13. , Data_(data)
  14. {
  15. }
  16. template <>
  17. TIntrusivePtr<TColumnEnum<i8>> TColumnEnum<i8>::Create(const TVector<TEnumItem>& enumItems) {
  18. TTypeRef type = TType::CreateEnum8(enumItems);
  19. return new TColumnEnum<i8>(type);
  20. }
  21. template <>
  22. TIntrusivePtr<TColumnEnum<i8>> TColumnEnum<i8>::Create(
  23. const TVector<TEnumItem>& enumItems,
  24. const TVector<i8>& values,
  25. bool checkValues) {
  26. TTypeRef type = TType::CreateEnum8(enumItems);
  27. if (checkValues) {
  28. for (i8 value : values) {
  29. Y_ENSURE(type->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value));
  30. }
  31. }
  32. return new TColumnEnum<i8>(type, values);
  33. }
  34. template <>
  35. TIntrusivePtr<TColumnEnum<i8>> TColumnEnum<i8>::Create(
  36. const TVector<TEnumItem>& enumItems,
  37. const TVector<TString>& names) {
  38. TTypeRef type = TType::CreateEnum8(enumItems);
  39. TVector<i8> values;
  40. values.reserve(names.size());
  41. for (const TString& name : names) {
  42. values.push_back(type->GetEnumValue(name));
  43. }
  44. return new TColumnEnum<i8>(type, values);
  45. }
  46. template <>
  47. TIntrusivePtr<TColumnEnum<i16>> TColumnEnum<i16>::Create(const TVector<TEnumItem>& enumItems) {
  48. TTypeRef type = TType::CreateEnum16(enumItems);
  49. return new TColumnEnum<i16>(type);
  50. }
  51. template <>
  52. TIntrusivePtr<TColumnEnum<i16>> TColumnEnum<i16>::Create(
  53. const TVector<TEnumItem>& enumItems,
  54. const TVector<i16>& values,
  55. bool checkValues) {
  56. TTypeRef type = TType::CreateEnum16(enumItems);
  57. if (checkValues) {
  58. for (i16 value : values) {
  59. Y_ENSURE(type->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value));
  60. }
  61. }
  62. return new TColumnEnum<i16>(type, values);
  63. }
  64. template <>
  65. TIntrusivePtr<TColumnEnum<i16>> TColumnEnum<i16>::Create(
  66. const TVector<TEnumItem>& enumItems,
  67. const TVector<TString>& names) {
  68. TTypeRef type = TType::CreateEnum16(enumItems);
  69. TVector<i16> values;
  70. values.reserve(names.size());
  71. for (const TString& name : names) {
  72. values.push_back(type->GetEnumValue(name));
  73. }
  74. return new TColumnEnum<i16>(type, values);
  75. }
  76. template <typename T>
  77. void TColumnEnum<T>::Append(const T& value, bool checkValue) {
  78. if (checkValue) {
  79. Y_ENSURE(Type_->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value));
  80. }
  81. Data_.push_back(value);
  82. }
  83. template <typename T>
  84. void TColumnEnum<T>::Append(const TString& name) {
  85. Data_.push_back(Type_->GetEnumValue(name));
  86. }
  87. template <typename T>
  88. const T& TColumnEnum<T>::At(size_t n) const {
  89. return Data_.at(n);
  90. }
  91. template <typename T>
  92. const TString& TColumnEnum<T>::NameAt(size_t n) const {
  93. return Type_->GetEnumName(Data_.at(n));
  94. }
  95. template <typename T>
  96. const T& TColumnEnum<T>::operator[](size_t n) const {
  97. return Data_[n];
  98. }
  99. template <typename T>
  100. void TColumnEnum<T>::SetAt(size_t n, const T& value, bool checkValue) {
  101. if (checkValue) {
  102. Y_ENSURE(Type_->HasEnumValue(value), Sprintf("Enum type doesn't have value %d", value));
  103. }
  104. Data_.at(n) = value;
  105. }
  106. template <typename T>
  107. void TColumnEnum<T>::SetNameAt(size_t n, const TString& name) {
  108. Data_.at(n) = Type_->GetEnumValue(name);
  109. }
  110. template <typename T>
  111. void TColumnEnum<T>::Append(TColumnRef column) {
  112. if (auto col = column->As<TColumnEnum<T>>()) {
  113. Data_.insert(Data_.end(), col->Data_.begin(), col->Data_.end());
  114. }
  115. }
  116. template <typename T>
  117. bool TColumnEnum<T>::Load(TCodedInputStream* input, size_t rows) {
  118. Data_.resize(rows);
  119. return input->ReadRaw(Data_.data(), Data_.size() * sizeof(T));
  120. }
  121. template <typename T>
  122. void TColumnEnum<T>::Save(TCodedOutputStream* output) {
  123. output->WriteRaw(Data_.data(), Data_.size() * sizeof(T));
  124. }
  125. template <typename T>
  126. size_t TColumnEnum<T>::Size() const {
  127. return Data_.size();
  128. }
  129. template <typename T>
  130. TColumnRef TColumnEnum<T>::Slice(size_t begin, size_t len) {
  131. return new TColumnEnum<T>(Type_, SliceVector(Data_, begin, len));
  132. }
  133. template class TColumnEnum<i8>;
  134. template class TColumnEnum<i16>;
  135. }