int TsFileWriter::write_table()

in cpp/src/writer/tsfile_writer.cc [706:777]


int TsFileWriter::write_table(Tablet &tablet) {
    int ret = E_OK;
    if (io_writer_->get_schema()->table_schema_map_.find(
            tablet.insert_target_name_) ==
        io_writer_->get_schema()->table_schema_map_.end()) {
        ret = E_TABLE_NOT_EXIST;
        return ret;
    }
    if (RET_FAIL(do_check_and_prepare_tablet(tablet))) {
        return ret;
    }

    auto device_id_end_index_pairs = split_tablet_by_device(tablet);
    int start_idx = 0;
    for (auto &device_id_end_index_pair : device_id_end_index_pairs) {
        auto device_id = device_id_end_index_pair.first;
        int end_idx = device_id_end_index_pair.second;
        if (end_idx == 0) continue;
        if (table_aligned_) {
            SimpleVector<ValueChunkWriter *> value_chunk_writers;
            TimeChunkWriter *time_chunk_writer = nullptr;
            if (RET_FAIL(do_check_schema_table(device_id, tablet,
                                               time_chunk_writer,
                                               value_chunk_writers))) {
                return ret;
            }
            for (int i = start_idx; i < end_idx; i++) {
                time_chunk_writer->write(tablet.timestamps_[i]);
            }
            uint32_t field_col_count = 0;
            for (uint32_t i = 0; i < tablet.get_column_count(); ++i) {
                if (tablet.column_categories_[i] ==
                    common::ColumnCategory::FIELD) {
                    ValueChunkWriter *value_chunk_writer =
                        value_chunk_writers[field_col_count];
                    if (IS_NULL(value_chunk_writer)) {
                        continue;
                    }

                    if (RET_FAIL(value_write_column(value_chunk_writer, tablet,
                                                    i, start_idx, end_idx))) {
                        return ret;
                    }
                    field_col_count++;
                }
            }
            start_idx = end_idx;
        } else {
            MeasurementNamesFromTablet mnames_getter(tablet);
            SimpleVector<ChunkWriter *> chunk_writers;
            if (RET_FAIL(
                    do_check_schema(device_id, mnames_getter, chunk_writers))) {
                return ret;
            }
            ASSERT(chunk_writers.size() == tablet.get_column_count());
            for (uint32_t c = 0; c < chunk_writers.size(); c++) {
                ChunkWriter *chunk_writer = chunk_writers[c];
                if (IS_NULL(chunk_writer)) {
                    continue;
                }
                if (RET_FAIL(write_column(chunk_writer, tablet, c, start_idx,
                             device_id_end_index_pair.second))) {
                    return ret;
                }
            }
            start_idx = device_id_end_index_pair.second;
        }
    }
    record_count_since_last_flush_ += tablet.cur_row_size_;
    ret = check_memory_size_and_may_flush_chunks();
    return ret;
}