in cpp/src/file/tsfile_io_reader.cc [507:581]
int TsFileIOReader::do_load_timeseries_index(
const std::string &measurement_name_str, int64_t start_offset,
int64_t end_offset, PageArena &in_timeseries_index_pa,
ITimeseriesIndex *&ret_timeseries_index) {
ASSERT(end_offset > start_offset);
int ret = E_OK;
int32_t read_size = (int32_t) (end_offset - start_offset);
int32_t ret_read_len = 0;
char *ti_buf = (char *) mem_alloc(read_size, MOD_TSFILE_READER);
if (IS_NULL(ti_buf)) {
return E_OOM;
}
if (RET_FAIL(
read_file_->read(start_offset, ti_buf, read_size, ret_read_len))) {
} else {
ByteStream bs;
bs.wrap_from(ti_buf, read_size);
const String target_measurement_name(
(char *) measurement_name_str.c_str(),
strlen(measurement_name_str.c_str()));
bool found = false;
#if DEBUG_SE
std::cout << "do_load_timeseries_index, reader file at " << start_offset
<< " to " << end_offset << std::endl;
#endif
bool is_aligned = false;
AlignedTimeseriesIndex *aligned_ts_idx = nullptr;
while (IS_SUCC(ret)) {
TimeseriesIndex cur_timeseries_index;
PageArena cur_timeseries_index_pa;
cur_timeseries_index_pa.init(512, MOD_TSFILE_READER); // TODO 512
if (RET_FAIL(cur_timeseries_index.deserialize_from(
bs, &cur_timeseries_index_pa))) {
} else if (is_aligned ||
cur_timeseries_index.get_data_type() == common::VECTOR) {
if (!is_aligned) {
is_aligned = true;
void *buf = in_timeseries_index_pa.alloc(
sizeof(AlignedTimeseriesIndex));
aligned_ts_idx = new(buf) AlignedTimeseriesIndex;
buf = in_timeseries_index_pa.alloc(sizeof(TimeseriesIndex));
aligned_ts_idx->time_ts_idx_ = new(buf) TimeseriesIndex;
aligned_ts_idx->time_ts_idx_->clone_from(
cur_timeseries_index, &in_timeseries_index_pa);
} else if (cur_timeseries_index.get_measurement_name().equal_to(
target_measurement_name)) {
void *buf =
in_timeseries_index_pa.alloc(sizeof(TimeseriesIndex));
aligned_ts_idx->value_ts_idx_ = new(buf) TimeseriesIndex;
aligned_ts_idx->value_ts_idx_->clone_from(
cur_timeseries_index, &in_timeseries_index_pa);
ret_timeseries_index = aligned_ts_idx;
found = true;
break;
}
} else if (!is_aligned &&
cur_timeseries_index.get_measurement_name().equal_to(
target_measurement_name)) {
void *buf =
in_timeseries_index_pa.alloc(sizeof(TimeseriesIndex));
auto ts_idx = new(buf) TimeseriesIndex;
ts_idx->clone_from(cur_timeseries_index,
&in_timeseries_index_pa);
ret_timeseries_index = ts_idx;
found = true;
break;
}
} // end while
if (!found) {
ret = E_NOT_EXIST;
}
}
mem_free(ti_buf);
return ret;
}