diff --git a/dbms/include/DB/DataStreams/PrettyBlockOutputStream.h b/dbms/include/DB/DataStreams/PrettyBlockOutputStream.h index 274942fd9afdf10240fd597135db6f47ec4f488e..65c8d03050f2c32d88a6f8c0435a89f5cf530805 100644 --- a/dbms/include/DB/DataStreams/PrettyBlockOutputStream.h +++ b/dbms/include/DB/DataStreams/PrettyBlockOutputStream.h @@ -18,7 +18,13 @@ public: void write(const Block & block); void writeSuffix(); + void setTotals(const Block & totals_) { totals = totals_; } + void setExtremes(const Block & extremes_) { extremes = extremes_; } + protected: + void writeTotals(); + void writeExtremes(); + typedef std::vector Widths_t; /// Вычислить видимую (при выводе на консоль с кодировкой UTF-8) ширину значений и имён столбцов. @@ -30,6 +36,9 @@ protected: size_t terminal_width; bool no_escapes; + + Block totals; + Block extremes; }; } diff --git a/dbms/include/DB/DataStreams/TabSeparatedRowOutputStream.h b/dbms/include/DB/DataStreams/TabSeparatedRowOutputStream.h index 4056e13700f690a0bab0afa164d5780552555edf..46056042d530f60300876264252e5945daa09bf2 100644 --- a/dbms/include/DB/DataStreams/TabSeparatedRowOutputStream.h +++ b/dbms/include/DB/DataStreams/TabSeparatedRowOutputStream.h @@ -24,14 +24,23 @@ public: void writeFieldDelimiter(); void writeRowEndDelimiter(); void writePrefix(); + void writeSuffix(); + + void setTotals(const Block & totals_) { totals = totals_; } + void setExtremes(const Block & extremes_) { extremes = extremes_; } protected: + void writeTotals(); + void writeExtremes(); + WriteBuffer & ostr; const Block sample; bool with_names; bool with_types; DataTypes data_types; size_t field_number; + Block totals; + Block extremes; }; } diff --git a/dbms/src/DataStreams/PrettyBlockOutputStream.cpp b/dbms/src/DataStreams/PrettyBlockOutputStream.cpp index fce10ceefe036ceb4a8779c0f72795f3e71c21c2..5b30073be1076531533295786bebf13c65b8ff66 100644 --- a/dbms/src/DataStreams/PrettyBlockOutputStream.cpp +++ b/dbms/src/DataStreams/PrettyBlockOutputStream.cpp @@ -213,6 +213,30 @@ void PrettyBlockOutputStream::writeSuffix() writeIntText(max_rows, ostr); writeCString(".\n", ostr); } + + total_rows = 0; + writeTotals(); + writeExtremes(); +} + + +void PrettyBlockOutputStream::writeTotals() +{ + if (totals) + { + writeCString("\nTotals:\n", ostr); + write(totals); + } +} + + +void PrettyBlockOutputStream::writeExtremes() +{ + if (extremes) + { + writeCString("\nExtremes:\n", ostr); + write(extremes); + } } diff --git a/dbms/src/DataStreams/PrettyCompactMonoBlockOutputStream.cpp b/dbms/src/DataStreams/PrettyCompactMonoBlockOutputStream.cpp index be20dd20023049ba493567cd00e8887f8f5d96a6..d238dd2633db2576a00d865f1d916954f37185d1 100644 --- a/dbms/src/DataStreams/PrettyCompactMonoBlockOutputStream.cpp +++ b/dbms/src/DataStreams/PrettyCompactMonoBlockOutputStream.cpp @@ -45,8 +45,27 @@ void PrettyCompactMonoBlockOutputStream::writeSuffix() } writeBottom(max_widths); - - PrettyBlockOutputStream::writeSuffix(); + + if (total_rows >= max_rows) + { + writeCString(" Showed first ", ostr); + writeIntText(max_rows, ostr); + writeCString(".\n", ostr); + } + + total_rows = 0; + + if (totals) + { + writeCString("\nTotals:\n", ostr); + PrettyCompactBlockOutputStream::write(totals); + } + + if (extremes) + { + writeCString("\nExtremes:\n", ostr); + PrettyCompactBlockOutputStream::write(extremes); + } } } diff --git a/dbms/src/DataStreams/PrettySpaceBlockOutputStream.cpp b/dbms/src/DataStreams/PrettySpaceBlockOutputStream.cpp index 7a0085b2df85b277c6edcb0d91f53d826dd21e32..a26b0e95e3927cdb686ee5a19be356e7667e2b51 100644 --- a/dbms/src/DataStreams/PrettySpaceBlockOutputStream.cpp +++ b/dbms/src/DataStreams/PrettySpaceBlockOutputStream.cpp @@ -109,6 +109,10 @@ void PrettySpaceBlockOutputStream::writeSuffix() writeIntText(max_rows, ostr); writeCString(".", ostr); } + + total_rows = 0; + writeTotals(); + writeExtremes(); } } diff --git a/dbms/src/DataStreams/TabSeparatedRowOutputStream.cpp b/dbms/src/DataStreams/TabSeparatedRowOutputStream.cpp index b62f36c9b34734295111e095d1e7f455e40f8dba..b29079a82f2fb1cca11f542026edba32ba4780f1 100644 --- a/dbms/src/DataStreams/TabSeparatedRowOutputStream.cpp +++ b/dbms/src/DataStreams/TabSeparatedRowOutputStream.cpp @@ -62,4 +62,62 @@ void TabSeparatedRowOutputStream::writeRowEndDelimiter() field_number = 0; } + +void TabSeparatedRowOutputStream::writeSuffix() +{ + writeTotals(); + writeExtremes(); +} + + +void TabSeparatedRowOutputStream::writeTotals() +{ + if (totals) + { + size_t columns = totals.columns(); + + writeChar('\n', ostr); + writeRowStartDelimiter(); + + for (size_t j = 0; j < columns; ++j) + { + if (j != 0) + writeFieldDelimiter(); + writeField((*totals.getByPosition(j).column)[0]); + } + + writeRowEndDelimiter(); + } +} + + +void TabSeparatedRowOutputStream::writeExtremes() +{ + if (extremes) + { + size_t rows = extremes.rows(); + size_t columns = extremes.columns(); + + writeChar('\n', ostr); + + for (size_t i = 0; i < rows; ++i) + { + if (i != 0) + writeRowBetweenDelimiter(); + + writeRowStartDelimiter(); + + for (size_t j = 0; j < columns; ++j) + { + if (j != 0) + writeFieldDelimiter(); + writeField((*extremes.getByPosition(j).column)[i]); + } + + writeRowEndDelimiter(); + } + } +} + + }