diff --git a/clickhouse/columns/array.cpp b/clickhouse/columns/array.cpp index 94163c4d..5cff819c 100644 --- a/clickhouse/columns/array.cpp +++ b/clickhouse/columns/array.cpp @@ -163,10 +163,14 @@ size_t ColumnArray::GetSize(size_t n) const { return (n == 0) ? (*offsets_)[n] : ((*offsets_)[n] - (*offsets_)[n - 1]); } -ColumnRef ColumnArray::GetData() { +ColumnRef ColumnArray::GetData() const { return data_; } +const std::shared_ptr& ColumnArray::GetOffsets() const { + return offsets_; +} + void ColumnArray::Reset() { data_.reset(); offsets_.reset(); diff --git a/clickhouse/columns/array.h b/clickhouse/columns/array.h index 3ad9c94d..a80aecb6 100644 --- a/clickhouse/columns/array.h +++ b/clickhouse/columns/array.h @@ -78,14 +78,24 @@ class ColumnArray : public Column { void OffsetsIncrease(size_t); + /// Gets the backing data array of the Array's. This does not include any Array Bounds. + ColumnRef GetData() const; + + /// Gets all offsets denoting the list boundaries overlayed GetData. + /// The layout is [size_i, ...] where `i` is the row. + const std::shared_ptr& GetOffsets() const; + + /// Gets the offset of the start of row `n` into `GetData()`. + size_t GetOffset(size_t n) const; + + /// Gets the element count of row `n`. + size_t GetSize(size_t n) const; + protected: template friend class ColumnArrayT; ColumnArray(ColumnArray&& array); - size_t GetOffset(size_t n) const; - size_t GetSize(size_t n) const; - ColumnRef GetData(); void AddOffset(size_t n); void Reset(); @@ -262,11 +272,9 @@ class ColumnArrayT : public ColumnArray { template inline void Append(Container&& container) { using container_type = decltype(container); - if constexpr (std::is_lvalue_reference_v || - std::is_const_v>) { + if constexpr (std::is_lvalue_reference_v || std::is_const_v>) { Append(std::begin(container), std::end(container)); - } - else { + } else { Append(std::make_move_iterator(std::begin(container)), std::make_move_iterator(std::end(container))); }