int TsFileIOReader::do_load_timeseries_index()

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;
}