| 1 | #pragma once |
| 2 | |
| 3 | #include <vector> |
| 4 | #include <memory> |
| 5 | #include <cstddef> |
| 6 | #include <string> |
| 7 | #include <Core/Field.h> |
| 8 | |
| 9 | class Collator; |
| 10 | |
| 11 | namespace DB |
| 12 | { |
| 13 | |
| 14 | struct FillColumnDescription |
| 15 | { |
| 16 | /// All missed values in range [FROM, TO) will be filled |
| 17 | /// Range [FROM, TO) respects sorting direction |
| 18 | Field fill_from; /// Fill value >= FILL_FROM |
| 19 | Field fill_to; /// Fill value + STEP < FILL_TO |
| 20 | Field fill_step; /// Default = 1 or -1 according to direction |
| 21 | }; |
| 22 | |
| 23 | /// Description of the sorting rule by one column. |
| 24 | struct SortColumnDescription |
| 25 | { |
| 26 | std::string column_name; /// The name of the column. |
| 27 | size_t column_number; /// Column number (used if no name is given). |
| 28 | int direction; /// 1 - ascending, -1 - descending. |
| 29 | int nulls_direction; /// 1 - NULLs and NaNs are greater, -1 - less. |
| 30 | /// To achieve NULLS LAST, set it equal to direction, to achieve NULLS FIRST, set it opposite. |
| 31 | std::shared_ptr<Collator> collator; /// Collator for locale-specific comparison of strings |
| 32 | bool with_fill; |
| 33 | FillColumnDescription fill_description; |
| 34 | |
| 35 | |
| 36 | SortColumnDescription( |
| 37 | size_t column_number_, int direction_, int nulls_direction_, |
| 38 | const std::shared_ptr<Collator> & collator_ = nullptr, bool with_fill_ = false, |
| 39 | const FillColumnDescription & fill_description_ = {}) |
| 40 | : column_number(column_number_), direction(direction_), nulls_direction(nulls_direction_), collator(collator_) |
| 41 | , with_fill(with_fill_), fill_description(fill_description_) {} |
| 42 | |
| 43 | SortColumnDescription( |
| 44 | const std::string & column_name_, int direction_, int nulls_direction_, |
| 45 | const std::shared_ptr<Collator> & collator_ = nullptr, bool with_fill_ = false, |
| 46 | const FillColumnDescription & fill_description_ = {}) |
| 47 | : column_name(column_name_), column_number(0), direction(direction_), nulls_direction(nulls_direction_) |
| 48 | , collator(collator_), with_fill(with_fill_), fill_description(fill_description_) {} |
| 49 | |
| 50 | bool operator == (const SortColumnDescription & other) const |
| 51 | { |
| 52 | return column_name == other.column_name && column_number == other.column_number |
| 53 | && direction == other.direction && nulls_direction == other.nulls_direction; |
| 54 | } |
| 55 | |
| 56 | bool operator != (const SortColumnDescription & other) const |
| 57 | { |
| 58 | return !(*this == other); |
| 59 | } |
| 60 | }; |
| 61 | |
| 62 | /// Description of the sorting rule for several columns. |
| 63 | using SortDescription = std::vector<SortColumnDescription>; |
| 64 | |
| 65 | } |
| 66 | |