array.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #include "array.h"
  2. #include <util/generic/yexception.h>
  3. namespace NClickHouse {
  4. TColumnArray::TColumnArray(TColumnRef data)
  5. : TColumn(TType::CreateArray(data->Type()))
  6. , Data_(data)
  7. , Offsets_(TColumnUInt64::Create())
  8. {
  9. }
  10. TColumnArray::TColumnArray(TColumnRef data, TVector<ui64>&& offsets)
  11. : TColumn(TType::CreateArray(data->Type()))
  12. , Data_(data)
  13. , Offsets_(TColumnUInt64::Create(std::move(offsets)))
  14. {
  15. }
  16. TIntrusivePtr<TColumnArray> TColumnArray::Create(TColumnRef data) {
  17. return new TColumnArray(data);
  18. }
  19. TIntrusivePtr<TColumnArray> TColumnArray::Create(TColumnRef data, TVector<ui64>&& offsets) {
  20. return new TColumnArray(data, std::move(offsets));
  21. }
  22. void TColumnArray::AppendAsColumn(TColumnRef array) {
  23. if (!Data_->Type()->IsEqual(array->Type())) {
  24. ythrow yexception()
  25. << "can't append column of type " << array->Type()->GetName() << " "
  26. << "to column type " << Data_->Type()->GetName();
  27. }
  28. if (Offsets_->Size() == 0) {
  29. Offsets_->Append(array->Size());
  30. } else {
  31. Offsets_->Append((*Offsets_)[Offsets_->Size() - 1] + array->Size());
  32. }
  33. Data_->Append(array);
  34. }
  35. void TColumnArray::Append(TColumnRef column) {
  36. if (auto col = column->As<TColumnArray>()) {
  37. if (!col->Data_->Type()->IsEqual(Data_->Type())) {
  38. return;
  39. }
  40. for (size_t i = 0; i < col->Size(); ++i) {
  41. AppendAsColumn(col->GetAsColumn(i));
  42. }
  43. }
  44. }
  45. TColumnRef TColumnArray::GetAsColumn(size_t n) const {
  46. return Data_->Slice(GetOffset(n), GetSize(n));
  47. }
  48. bool TColumnArray::Load(TCodedInputStream* input, size_t rows) {
  49. if (!Offsets_->Load(input, rows)) {
  50. return false;
  51. }
  52. if (!Data_->Load(input, (*Offsets_)[rows - 1])) {
  53. return false;
  54. }
  55. return true;
  56. }
  57. void TColumnArray::Save(TCodedOutputStream* output) {
  58. Offsets_->Save(output);
  59. Data_->Save(output);
  60. }
  61. size_t TColumnArray::Size() const {
  62. return Offsets_->Size();
  63. }
  64. size_t TColumnArray::GetOffset(size_t n) const {
  65. return (n == 0) ? 0 : (*Offsets_)[n - 1];
  66. }
  67. size_t TColumnArray::GetSize(size_t n) const {
  68. return (n == 0) ? (*Offsets_)[n] : ((*Offsets_)[n] - (*Offsets_)[n - 1]);
  69. }
  70. }