in cpp/src/common/tsblock/tsblock.cc [125:214]
void TsBlock::tsblock_to_json(ByteStream *byte_stream) {
// 1. append start tag
byte_stream->write_buf("{\n", 2);
// 2. append output columns to bytestream
int column_count = tuple_desc_->get_column_count();
// 2.1 append header
byte_stream->write_buf(" \"expressions\": [\n", 19);
// 2.2 append column names
for (int i = 1; i < column_count; ++i) {
std::string name = tuple_desc_->get_column_name(i);
byte_stream->write_buf(" ", 4);
byte_stream->write_buf("\"", 1);
byte_stream->write_buf(name.c_str(), name.length());
byte_stream->write_buf("\"", 1);
if (i == column_count - 1) {
byte_stream->write_buf("\n", 1);
} else {
byte_stream->write_buf(",\n", 2);
}
}
byte_stream->write_buf(" ],\n", 5);
// 3. append column_names
byte_stream->write_buf(" \"column_names\": null,\n", 24);
// 4. append time value
byte_stream->write_buf(" \"timestamps\": [\n", 18);
ColIterator time_iter(0, this);
bool is_first = true;
while (!time_iter.end()) {
uint32_t ilen;
byte_stream->write_buf(" ", 4);
char *val = time_iter.read(&ilen);
if (!is_first) {
byte_stream->write_buf(",\n", 2);
}
is_first = false;
write_data(byte_stream, val, ilen, false, INT64);
time_iter.next();
}
byte_stream->write_buf(" ],\n", 5);
// 5. append user values
byte_stream->write_buf(" \"values\": [\n", 14);
for (int i = 1; i < column_count; ++i) {
byte_stream->write_buf(" [\n", 6);
ColIterator value_iter(i, this);
bool has_null = value_iter.has_null();
if (LIKELY(!has_null)) {
bool is_first = true; // cppcheck-suppress shadowVariable
while (!value_iter.end()) {
uint32_t ilen = 0;
byte_stream->write_buf(" ", 6);
char *val = value_iter.read(&ilen);
if (!is_first) {
byte_stream->write_buf(",\n", 2);
}
is_first = false;
write_data(byte_stream, val, ilen, false,
tuple_desc_->get_column_type(i));
value_iter.next();
}
} else {
while (!value_iter.end()) {
bool inull;
uint32_t ilen = 0;
byte_stream->write_buf(" ", 6);
char *val = value_iter.read(&ilen, &inull);
if (!is_first) {
byte_stream->write_buf(",\n", 2);
}
is_first = false;
write_data(byte_stream, val, ilen, inull,
tuple_desc_->get_column_type(i));
value_iter.next();
}
}
if (i == column_count - 1) {
byte_stream->write_buf(" ]\n", 6);
} else {
byte_stream->write_buf(" ],\n", 7);
}
}
byte_stream->write_buf(" ]\n", 4);
// 6. end
byte_stream->write_buf("}\n", 2);
}