int TsFileSeriesScanIterator::get_next()

in cpp/src/reader/tsfile_series_scan_iterator.cc [39:86]


int TsFileSeriesScanIterator::get_next(TsBlock *&ret_tsblock, bool alloc,
                                       Filter *oneshoot_filter) {
    // TODO @filter
    int ret = E_OK;
    Filter *filter =
        (oneshoot_filter != nullptr) ? oneshoot_filter : time_filter_;
    if (!chunk_reader_->has_more_data()) {
        while (true) {
            if (!has_next_chunk()) {
                return E_NO_MORE_DATA;
            } else {
                if (!is_aligned_) {
                    ChunkMeta *cm = get_current_chunk_meta();
                    advance_to_next_chunk();
                    if (filter != nullptr && cm->statistic_ != nullptr &&
                        !filter->satisfy(cm->statistic_)) {
                        continue;
                    }
                    chunk_reader_->reset();
                    if (RET_FAIL(chunk_reader_->load_by_meta(cm))) {
                    }
                    break;
                } else {
                    ChunkMeta *value_cm = value_chunk_meta_cursor_.get();
                    ChunkMeta *time_cm = time_chunk_meta_cursor_.get();
                    advance_to_next_chunk();
                    if (filter != nullptr && value_cm->statistic_ != nullptr &&
                        !filter->satisfy(value_cm->statistic_)) {
                        continue;
                    }
                    chunk_reader_->reset();
                    if (RET_FAIL(chunk_reader_->load_by_aligned_meta(
                            time_cm, value_cm))) {
                    }
                    break;
                }
            }
        }
    }
    if (IS_SUCC(ret)) {
        if (alloc) {
            ret_tsblock = alloc_tsblock();
        }
        ret = chunk_reader_->get_next_page(ret_tsblock, filter,
                                           *data_pa_);
    }
    return ret;
}