bool ResultSet::isRowAtEmpty(const size_t logical_index) const { if (logical_index >= entryCount()) { return true; } const auto entry_idx = permutation_.empty() ? logical_index : permutation_[logical_index]; const auto storage_lookup_result = findStorage(entry_idx); const auto storage = storage_lookup_result.storage_ptr; const auto local_entry_idx = storage_lookup_result.fixedup_entry_idx; return storage->isEmptyEntry(local_entry_idx); }
// Not all entries in the buffer represent a valid row. Advance the internal cursor // used for the getNextRow method to the next row which is valid. size_t ResultSet::advanceCursorToNextEntry() const { while (crt_row_buff_idx_ < entryCount()) { const auto entry_idx = permutation_.empty() ? crt_row_buff_idx_ : permutation_[crt_row_buff_idx_]; const auto storage_lookup_result = findStorage(entry_idx); const auto storage = storage_lookup_result.storage_ptr; const auto fixedup_entry_idx = storage_lookup_result.fixedup_entry_idx; if (!storage->isEmptyEntry(fixedup_entry_idx)) { break; } ++crt_row_buff_idx_; } if (permutation_.empty()) { return crt_row_buff_idx_; } CHECK_LE(crt_row_buff_idx_, permutation_.size()); return crt_row_buff_idx_ == permutation_.size() ? crt_row_buff_idx_ : permutation_[crt_row_buff_idx_]; }
OneIntegerColumnRow ResultSet::getOneColRow(const size_t global_entry_idx) const { const auto storage_lookup_result = findStorage(global_entry_idx); const auto storage = storage_lookup_result.storage_ptr; const auto local_entry_idx = storage_lookup_result.fixedup_entry_idx; if (storage->isEmptyEntry(local_entry_idx)) { return {0, false}; } const auto buff = storage->buff_; CHECK(buff); CHECK(!query_mem_desc_.output_columnar); const auto keys_ptr = row_ptr_rowwise(buff, query_mem_desc_, local_entry_idx); const auto key_bytes_with_padding = align_to_int64(get_key_bytes_rowwise(query_mem_desc_)); const auto rowwise_target_ptr = keys_ptr + key_bytes_with_padding; const auto tv = getTargetValueFromBufferRowwise( rowwise_target_ptr, keys_ptr, global_entry_idx, targets_.front(), 0, 0, false, false, false); const auto scalar_tv = boost::get<ScalarTargetValue>(&tv); CHECK(scalar_tv); const auto ival_ptr = boost::get<int64_t>(scalar_tv); CHECK(ival_ptr); return {*ival_ptr, true}; }
void XmlCache::storeXml(const std::string &name, const boost::shared_ptr<Xml> &xml) { assert(NULL != xml.get()); findStorage(name)->store(Policy::instance()->getKey(NULL, name), xml); }
boost::shared_ptr<Xml> XmlCache::fetchXml(const std::string &name) { return findStorage(name)->fetch(Policy::instance()->getKey(NULL, name)); }
std::vector<TargetValue> ResultSet::getRowAt(const size_t global_entry_idx, const bool translate_strings, const bool decimal_to_double, const bool fixup_count_distinct_pointers) const { const auto storage_lookup_result = fixup_count_distinct_pointers ? StorageLookupResult{storage_.get(), global_entry_idx, 0} : findStorage(global_entry_idx); const auto storage = storage_lookup_result.storage_ptr; const auto local_entry_idx = storage_lookup_result.fixedup_entry_idx; if (!fixup_count_distinct_pointers && storage->isEmptyEntry(local_entry_idx)) { return {}; } const auto buff = storage->buff_; CHECK(buff); std::vector<TargetValue> row; size_t agg_col_idx = 0; int8_t* rowwise_target_ptr{nullptr}; int8_t* keys_ptr{nullptr}; const int8_t* crt_col_ptr{nullptr}; if (query_mem_desc_.output_columnar) { crt_col_ptr = get_cols_ptr(buff, query_mem_desc_); } else { keys_ptr = row_ptr_rowwise(buff, query_mem_desc_, local_entry_idx); const auto key_bytes_with_padding = align_to_int64(get_key_bytes_rowwise(query_mem_desc_)); rowwise_target_ptr = keys_ptr + key_bytes_with_padding; } for (size_t target_idx = 0; target_idx < storage_->targets_.size(); ++target_idx) { const auto& agg_info = storage_->targets_[target_idx]; if (query_mem_desc_.output_columnar) { const auto next_col_ptr = advance_to_next_columnar_target_buff(crt_col_ptr, query_mem_desc_, agg_col_idx); const auto col2_ptr = (agg_info.is_agg && agg_info.agg_kind == kAVG) ? next_col_ptr : nullptr; const auto compact_sz2 = (agg_info.is_agg && agg_info.agg_kind == kAVG) ? query_mem_desc_.agg_col_widths[agg_col_idx + 1].compact : 0; row.push_back(getTargetValueFromBufferColwise(crt_col_ptr, query_mem_desc_.agg_col_widths[agg_col_idx].compact, col2_ptr, compact_sz2, global_entry_idx, agg_info, target_idx, translate_strings, decimal_to_double)); crt_col_ptr = next_col_ptr; if (agg_info.is_agg && agg_info.agg_kind == kAVG) { crt_col_ptr = advance_to_next_columnar_target_buff(crt_col_ptr, query_mem_desc_, agg_col_idx + 1); } } else { row.push_back(getTargetValueFromBufferRowwise(rowwise_target_ptr, keys_ptr, global_entry_idx, agg_info, target_idx, agg_col_idx, translate_strings, decimal_to_double, fixup_count_distinct_pointers)); rowwise_target_ptr = advance_target_ptr(rowwise_target_ptr, agg_info, agg_col_idx, query_mem_desc_, none_encoded_strings_valid_); } agg_col_idx = advance_slot(agg_col_idx, agg_info, none_encoded_strings_valid_); } return row; }