1 | #pragma once |
2 | |
3 | #include <Formats/FormatFactory.h> |
4 | #include <Processors/Formats/IOutputFormat.h> |
5 | |
6 | #include <string> |
7 | |
8 | |
9 | namespace DB |
10 | { |
11 | |
12 | class WriteBuffer; |
13 | |
14 | /** Output format that writes data row by row. |
15 | */ |
16 | class IRowOutputFormat : public IOutputFormat |
17 | { |
18 | protected: |
19 | DataTypes types; |
20 | |
21 | void consume(Chunk chunk) override; |
22 | void consumeTotals(Chunk chunk) override; |
23 | void consumeExtremes(Chunk chunk) override; |
24 | void finalize() override; |
25 | |
26 | public: |
27 | IRowOutputFormat(const Block & , WriteBuffer & out_, FormatFactory::WriteCallback callback) |
28 | : IOutputFormat(header, out_), types(header.getDataTypes()), write_single_row_callback(callback) |
29 | { |
30 | } |
31 | |
32 | /** Write a row. |
33 | * Default implementation calls methods to write single values and delimiters |
34 | * (except delimiter between rows (writeRowBetweenDelimiter())). |
35 | */ |
36 | virtual void write(const Columns & columns, size_t row_num); |
37 | virtual void writeMinExtreme(const Columns & columns, size_t row_num); |
38 | virtual void writeMaxExtreme(const Columns & columns, size_t row_num); |
39 | virtual void writeTotals(const Columns & columns, size_t row_num); |
40 | |
41 | /** Write single value. */ |
42 | virtual void writeField(const IColumn & column, const IDataType & type, size_t row_num) = 0; |
43 | |
44 | /** Write delimiter. */ |
45 | virtual void writeFieldDelimiter() {} /// delimiter between values |
46 | virtual void writeRowStartDelimiter() {} /// delimiter before each row |
47 | virtual void writeRowEndDelimiter() {} /// delimiter after each row |
48 | virtual void writeRowBetweenDelimiter() {} /// delimiter between rows |
49 | virtual void writePrefix() {} /// delimiter before resultset |
50 | virtual void writeSuffix() {} /// delimiter after resultset |
51 | virtual void writeBeforeTotals() {} |
52 | virtual void writeAfterTotals() {} |
53 | virtual void writeBeforeExtremes() {} |
54 | virtual void writeAfterExtremes() {} |
55 | virtual void writeLastSuffix() {} /// Write something after resultset, totals end extremes. |
56 | |
57 | private: |
58 | bool first_row = true; |
59 | bool prefix_written = false; |
60 | bool suffix_written = false; |
61 | |
62 | // Callback used to indicate that another row is written. |
63 | FormatFactory::WriteCallback write_single_row_callback; |
64 | |
65 | void writePrefixIfNot() |
66 | { |
67 | if (!prefix_written) |
68 | writePrefix(); |
69 | |
70 | prefix_written = true; |
71 | } |
72 | |
73 | void writeSuffixIfNot() |
74 | { |
75 | if (!suffix_written) |
76 | writeSuffix(); |
77 | |
78 | suffix_written = true; |
79 | } |
80 | |
81 | }; |
82 | |
83 | } |
84 | |