| 1 | #pragma once | 
|---|
| 2 | #include <Processors/ISimpleTransform.h> | 
|---|
| 3 | #include <Core/SortDescription.h> | 
|---|
| 4 |  | 
|---|
| 5 | namespace DB | 
|---|
| 6 | { | 
|---|
| 7 |  | 
|---|
| 8 | /** Sorts each block individually by the values of the specified columns. | 
|---|
| 9 | * At the moment, not very optimal algorithm is used. | 
|---|
| 10 | */ | 
|---|
| 11 | class PartialSortingTransform : public ISimpleTransform | 
|---|
| 12 | { | 
|---|
| 13 | public: | 
|---|
| 14 | /// limit - if not 0, then you can sort each block not completely, but only `limit` first rows by order. | 
|---|
| 15 | /// When count_rows is false, getNumReadRows() will always return 0. | 
|---|
| 16 | PartialSortingTransform( | 
|---|
| 17 | const Block & , | 
|---|
| 18 | SortDescription & description_, | 
|---|
| 19 | UInt64 limit_ = 0, | 
|---|
| 20 | bool do_count_rows_ = true); | 
|---|
| 21 |  | 
|---|
| 22 | String getName() const override { return "PartialSortingTransform"; } | 
|---|
| 23 |  | 
|---|
| 24 | /// Total num rows passed to transform. | 
|---|
| 25 | UInt64 getNumReadRows() const { return read_rows; } | 
|---|
| 26 |  | 
|---|
| 27 | protected: | 
|---|
| 28 | void transform(Chunk & chunk) override; | 
|---|
| 29 |  | 
|---|
| 30 | private: | 
|---|
| 31 | SortDescription description; | 
|---|
| 32 | UInt64 limit; | 
|---|
| 33 | UInt64 read_rows = 0; | 
|---|
| 34 |  | 
|---|
| 35 | /// Do we need calculate read_rows value? | 
|---|
| 36 | /// Used to skip total row when count rows_before_limit_at_least. | 
|---|
| 37 | bool do_count_rows; | 
|---|
| 38 | }; | 
|---|
| 39 |  | 
|---|
| 40 | } | 
|---|
| 41 |  | 
|---|