ClickHouse/dbms/src/DataStreams/PrettyCompactBlockOutputStream.cpp

141 lines
3.0 KiB
C++
Raw Normal View History

#include <DB/IO/WriteBuffer.h>
#include <DB/IO/WriteHelpers.h>
2011-11-28 04:05:53 +00:00
#include <DB/DataStreams/PrettyCompactBlockOutputStream.h>
namespace DB
{
namespace ErrorCodes
{
extern const int ILLEGAL_COLUMN;
}
void PrettyCompactBlockOutputStream::writeHeader(
const Block & block,
const Widths_t & max_widths,
const Widths_t & name_widths)
2011-11-28 04:05:53 +00:00
{
2017-03-25 20:12:56 +00:00
/// Names
writeCString("┌─", ostr);
for (size_t i = 0; i < max_widths.size(); ++i)
2011-11-28 04:05:53 +00:00
{
if (i != 0)
writeCString("─┬─", ostr);
2011-11-28 04:05:53 +00:00
const ColumnWithTypeAndName & col = block.safeGetByPosition(i);
2011-11-28 04:05:53 +00:00
if (col.type->isNumeric())
{
for (size_t k = 0; k < max_widths[i] - name_widths[i]; ++k)
writeCString("", ostr);
2011-11-28 04:05:53 +00:00
2012-06-25 05:07:34 +00:00
if (!no_escapes)
writeCString("\033[1m", ostr);
2011-11-28 04:05:53 +00:00
writeEscapedString(col.name, ostr);
2012-06-25 05:07:34 +00:00
if (!no_escapes)
writeCString("\033[0m", ostr);
2011-11-28 04:05:53 +00:00
}
else
{
2012-06-25 05:07:34 +00:00
if (!no_escapes)
writeCString("\033[1m", ostr);
2011-11-28 04:05:53 +00:00
writeEscapedString(col.name, ostr);
2012-06-25 05:07:34 +00:00
if (!no_escapes)
writeCString("\033[0m", ostr);
2011-11-28 04:05:53 +00:00
for (size_t k = 0; k < max_widths[i] - name_widths[i]; ++k)
writeCString("", ostr);
2011-11-28 04:05:53 +00:00
}
}
writeCString("─┐\n", ostr);
}
2011-11-28 04:05:53 +00:00
void PrettyCompactBlockOutputStream::writeBottom(const Widths_t & max_widths)
{
2017-03-25 20:12:56 +00:00
/// Create delimiters
std::stringstream bottom_separator;
bottom_separator << "";
for (size_t i = 0; i < max_widths.size(); ++i)
2011-11-28 04:05:53 +00:00
{
if (i != 0)
bottom_separator << "";
2011-11-28 04:05:53 +00:00
for (size_t j = 0; j < max_widths[i] + 2; ++j)
bottom_separator << "";
}
bottom_separator << "\n";
writeString(bottom_separator.str(), ostr);
}
void PrettyCompactBlockOutputStream::writeRow(
size_t row_id,
const Block & block,
const Widths_t & max_widths,
const Widths_t & name_widths)
{
size_t columns = max_widths.size();
writeCString("", ostr);
for (size_t j = 0; j < columns; ++j)
{
if (j != 0)
writeCString("", ostr);
const ColumnWithTypeAndName & col = block.safeGetByPosition(j);
if (col.type->isNumeric())
2011-11-28 04:05:53 +00:00
{
size_t width = get<UInt64>((*block.safeGetByPosition(columns + j).column)[row_id]);
for (size_t k = 0; k < max_widths[j] - width; ++k)
writeChar(' ', ostr);
2016-08-17 13:38:33 +00:00
col.type->serializeTextEscaped(*col.column.get(), row_id, ostr);
2011-11-28 04:05:53 +00:00
}
else
{
col.type->serializeTextEscaped(*col.column.get(), row_id, ostr);
2016-08-17 13:38:33 +00:00
size_t width = get<UInt64>((*block.safeGetByPosition(columns + j).column)[row_id]);
for (size_t k = 0; k < max_widths[j] - width; ++k)
writeChar(' ', ostr);
}
2011-11-28 04:05:53 +00:00
}
writeCString("\n", ostr);
}
void PrettyCompactBlockOutputStream::write(const Block & block_)
{
if (total_rows >= max_rows)
{
total_rows += block_.rows();
return;
}
/// We will insert columns here with the calculated values of visible lengths.
Block block = block_;
size_t rows = block.rows();
Widths_t max_widths;
Widths_t name_widths;
calculateWidths(block, max_widths, name_widths);
writeHeader(block, max_widths, name_widths);
for (size_t i = 0; i < rows && total_rows + i < max_rows; ++i)
writeRow(i, block, max_widths, name_widths);
writeBottom(max_widths);
2011-11-28 04:05:53 +00:00
total_rows += rows;
}
}