userver: userver/storages/clickhouse/io/columns/base_column.hpp Source File
Loading...
Searching...
No Matches
base_column.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/storages/clickhouse/io/columns/base_column.hpp
4/// @brief @copybrief storages::clickhouse::io::columns::ClickhouseColumn
5
6#include <userver/storages/clickhouse/io/columns/column_iterator.hpp>
7#include <userver/storages/clickhouse/io/columns/column_wrapper.hpp>
8
9USERVER_NAMESPACE_BEGIN
10
11namespace storages::clickhouse::io::columns {
12
13/// @brief Base class for every typed ClickHouse column.
14/// To add new columns one should derive from this class,
15/// define types aliases:
16/// - `cpp_type` - to what C++ types are column values mapped,
17/// - `container_type` (being `std::vector<cpp_type>`)
18///
19/// and implement 3 methods:
20/// - `ctor(ColumnRef)` - column constructor,
21/// - `static ColumnRef Serialize(const container_type&)` - constructs a column from C++ container,
22/// - `cpp_type ColumnIterator<YourColumnType>::DataHolder::Get()`
23///
24/// see implementation of any of the existing columns for better understanding.
25template <typename ColumnType>
27public:
28 using iterator = ColumnIterator<ColumnType>;
29
30 ClickhouseColumn(ColumnRef column)
31 : column_{std::move(column)}
32 {}
33
34 iterator begin() const { return iterator{column_}; }
35
36 iterator end() const { return iterator::End(column_); }
37
38 size_t Size() const { return GetColumnSize(column_); }
39
40private:
41 ColumnRef column_;
42};
43
44} // namespace storages::clickhouse::io::columns
45
46USERVER_NAMESPACE_END