55namespace clickhouse {
66
77ColumnArray::ColumnArray (ColumnRef data)
8+ : ColumnArray(data, std::make_shared<ColumnUInt64>())
9+ {
10+ }
11+
12+ ColumnArray::ColumnArray (ColumnRef data, std::shared_ptr<ColumnUInt64> offsets)
813 : Column(Type::CreateArray(data->Type ()))
914 , data_(data)
10- , offsets_(std::make_shared<ColumnUInt64>())
15+ , offsets_(offsets)
16+ {
17+ }
18+
19+ ColumnArray::ColumnArray (ColumnArray&& other)
20+ : Column(other.Type())
21+ , data_(std::move(other.data_))
22+ , offsets_(std::move(other.offsets_))
1123{
1224}
1325
@@ -18,30 +30,33 @@ void ColumnArray::AppendAsColumn(ColumnRef array) {
1830 " to column type " + data_->Type ()->GetName ());
1931 }
2032
21- if (offsets_->Size () == 0 ) {
22- offsets_->Append (array->Size ());
23- } else {
24- offsets_->Append ((*offsets_)[offsets_->Size () - 1 ] + array->Size ());
25- }
26-
33+ AddOffset (array->Size ());
2734 data_->Append (array);
2835}
2936
3037ColumnRef ColumnArray::GetAsColumn (size_t n) const {
38+ if (n >= Size ())
39+ throw ValidationError (" Index is out ouf bounds: " + std::to_string (n));
40+
3141 return data_->Slice (GetOffset (n), GetSize (n));
3242}
3343
3444ColumnRef ColumnArray::Slice (size_t begin, size_t size) const {
35- auto result = std::make_shared<ColumnArray>( GetAsColumn (begin));
36- result-> OffsetsIncrease ( 1 );
45+ if (size && begin + size > Size ())
46+ throw ValidationError ( " Slice indexes are out of bounds " );
3747
38- for (size_t i = 1 ; i < size; i++) {
39- result->Append (std::make_shared<ColumnArray>(GetAsColumn (begin + i)));
48+ auto result = std::make_shared<ColumnArray>(data_->CloneEmpty ());
49+ for (size_t i = 0 ; i < size; i++) {
50+ result->AppendAsColumn (GetAsColumn (begin + i));
4051 }
4152
4253 return result;
4354}
4455
56+ ColumnRef ColumnArray::CloneEmpty () const {
57+ return std::make_shared<ColumnArray>(data_->CloneEmpty ());
58+ }
59+
4560void ColumnArray::Append (ColumnRef column) {
4661 if (auto col = column->As <ColumnArray>()) {
4762 if (!col->data_ ->Type ()->IsEqual (data_->Type ())) {
@@ -54,22 +69,34 @@ void ColumnArray::Append(ColumnRef column) {
5469 }
5570}
5671
57- bool ColumnArray::Load (InputStream* input, size_t rows) {
72+ bool ColumnArray::LoadPrefix (InputStream* input, size_t rows) {
5873 if (!rows) {
5974 return true ;
6075 }
61- if (!offsets_->Load (input, rows)) {
76+
77+ return data_->LoadPrefix (input, rows);
78+ }
79+
80+ bool ColumnArray::LoadBody (InputStream* input, size_t rows) {
81+ if (!rows) {
82+ return true ;
83+ }
84+ if (!offsets_->LoadBody (input, rows)) {
6285 return false ;
6386 }
64- if (!data_->Load (input, (*offsets_)[rows - 1 ])) {
87+ if (!data_->LoadBody (input, (*offsets_)[rows - 1 ])) {
6588 return false ;
6689 }
6790 return true ;
6891}
6992
70- void ColumnArray::Save (OutputStream* output) {
71- offsets_->Save (output);
72- data_->Save (output);
93+ void ColumnArray::SavePrefix (OutputStream* output) {
94+ data_->SavePrefix (output);
95+ }
96+
97+ void ColumnArray::SaveBody (OutputStream* output) {
98+ offsets_->SaveBody (output);
99+ data_->SaveBody (output);
73100}
74101
75102void ColumnArray::Clear () {
@@ -92,11 +119,29 @@ void ColumnArray::OffsetsIncrease(size_t n) {
92119}
93120
94121size_t ColumnArray::GetOffset (size_t n) const {
122+
95123 return (n == 0 ) ? 0 : (*offsets_)[n - 1 ];
96124}
97125
126+ void ColumnArray::AddOffset (size_t n) {
127+ if (offsets_->Size () == 0 ) {
128+ offsets_->Append (n);
129+ } else {
130+ offsets_->Append ((*offsets_)[offsets_->Size () - 1 ] + n);
131+ }
132+ }
133+
98134size_t ColumnArray::GetSize (size_t n) const {
99135 return (n == 0 ) ? (*offsets_)[n] : ((*offsets_)[n] - (*offsets_)[n - 1 ]);
100136}
101137
138+ ColumnRef ColumnArray::GetData () {
139+ return data_;
140+ }
141+
142+ void ColumnArray::Reset () {
143+ data_.reset ();
144+ offsets_.reset ();
145+ }
146+
102147}
0 commit comments