1 | #pragma once |
2 | |
3 | #include <Core/Block.h> |
4 | |
5 | |
6 | namespace DB |
7 | { |
8 | |
9 | /** Column, that is just group of few another columns. |
10 | * |
11 | * For constant Tuples, see ColumnConst. |
12 | * Mixed constant/non-constant columns is prohibited in tuple |
13 | * for implementation simplicity. |
14 | */ |
15 | class ColumnTuple final : public COWHelper<IColumn, ColumnTuple> |
16 | { |
17 | private: |
18 | friend class COWHelper<IColumn, ColumnTuple>; |
19 | |
20 | using TupleColumns = std::vector<WrappedPtr>; |
21 | TupleColumns columns; |
22 | |
23 | template <bool positive> |
24 | struct Less; |
25 | |
26 | explicit ColumnTuple(MutableColumns && columns); |
27 | ColumnTuple(const ColumnTuple &) = default; |
28 | |
29 | public: |
30 | /** Create immutable column using immutable arguments. This arguments may be shared with other columns. |
31 | * Use IColumn::mutate in order to make mutable column and mutate shared nested columns. |
32 | */ |
33 | using Base = COWHelper<IColumn, ColumnTuple>; |
34 | static Ptr create(const Columns & columns); |
35 | static Ptr create(const TupleColumns & columns); |
36 | static Ptr create(Columns && arg) { return create(arg); } |
37 | |
38 | template <typename Arg, typename = typename std::enable_if<std::is_rvalue_reference<Arg &&>::value>::type> |
39 | static MutablePtr create(Arg && arg) { return Base::create(std::forward<Arg>(arg)); } |
40 | |
41 | std::string getName() const override; |
42 | const char * getFamilyName() const override { return "Tuple" ; } |
43 | |
44 | MutableColumnPtr cloneEmpty() const override; |
45 | MutableColumnPtr cloneResized(size_t size) const override; |
46 | |
47 | size_t size() const override |
48 | { |
49 | return columns.at(0)->size(); |
50 | } |
51 | |
52 | Field operator[](size_t n) const override; |
53 | void get(size_t n, Field & res) const override; |
54 | |
55 | StringRef getDataAt(size_t n) const override; |
56 | void insertData(const char * pos, size_t length) override; |
57 | void insert(const Field & x) override; |
58 | void insertFrom(const IColumn & src_, size_t n) override; |
59 | void insertDefault() override; |
60 | void popBack(size_t n) override; |
61 | StringRef serializeValueIntoArena(size_t n, Arena & arena, char const *& begin) const override; |
62 | const char * deserializeAndInsertFromArena(const char * pos) override; |
63 | void updateHashWithValue(size_t n, SipHash & hash) const override; |
64 | void insertRangeFrom(const IColumn & src, size_t start, size_t length) override; |
65 | ColumnPtr filter(const Filter & filt, ssize_t result_size_hint) const override; |
66 | ColumnPtr permute(const Permutation & perm, size_t limit) const override; |
67 | ColumnPtr index(const IColumn & indexes, size_t limit) const override; |
68 | ColumnPtr replicate(const Offsets & offsets) const override; |
69 | MutableColumns scatter(ColumnIndex num_columns, const Selector & selector) const override; |
70 | void gather(ColumnGathererStream & gatherer_stream) override; |
71 | int compareAt(size_t n, size_t m, const IColumn & rhs, int nan_direction_hint) const override; |
72 | void getExtremes(Field & min, Field & max) const override; |
73 | void getPermutation(bool reverse, size_t limit, int nan_direction_hint, Permutation & res) const override; |
74 | void reserve(size_t n) override; |
75 | size_t byteSize() const override; |
76 | size_t allocatedBytes() const override; |
77 | void protect() override; |
78 | void forEachSubcolumn(ColumnCallback callback) override; |
79 | bool structureEquals(const IColumn & rhs) const override; |
80 | |
81 | size_t tupleSize() const { return columns.size(); } |
82 | |
83 | const IColumn & getColumn(size_t idx) const { return *columns[idx]; } |
84 | IColumn & getColumn(size_t idx) { return *columns[idx]; } |
85 | |
86 | const TupleColumns & getColumns() const { return columns; } |
87 | Columns getColumnsCopy() const { return {columns.begin(), columns.end()}; } |
88 | |
89 | const ColumnPtr & getColumnPtr(size_t idx) const { return columns[idx]; } |
90 | }; |
91 | |
92 | |
93 | } |
94 | |