20#include "ignite/common/ignite_error.h"
21#include "ignite/common/primitive.h"
23#include <initializer_list>
25#include <unordered_map>
34ignite_tuple concat(
const ignite_tuple &left,
const ignite_tuple &right);
41 friend ignite_tuple detail::concat(
const ignite_tuple &left,
const ignite_tuple &right);
45 ignite_tuple() =
default;
53 m_pairs.reserve(capacity);
54 m_indices.reserve(capacity);
62 ignite_tuple(std::initializer_list<std::pair<std::string, primitive>> pairs)
65 m_indices.reserve(pairs.size());
66 for (
size_t i = 0; i < m_pairs.size(); ++i)
67 m_indices.emplace(std::make_pair(parse_name(m_pairs[i].first), i));
75 [[nodiscard]] std::int32_t
column_count() const noexcept {
return std::int32_t(m_pairs.size()); }
84 if (idx > m_pairs.size()) {
86 "Index is too large: idx=" + std::to_string(idx) +
", columns_num=" + std::to_string(m_pairs.size()));
88 return m_pairs[idx].second;
99 [[nodiscard]] T
get(uint32_t idx)
const {
111 void set(uint32_t idx, T &&value) {
112 if (idx > m_pairs.size()) {
114 "Index is too large: idx=" + std::to_string(idx) +
", columns_num=" + std::to_string(m_pairs.size()));
116 m_pairs[idx].second = std::forward<T>(value);
126 auto it = m_indices.find(parse_name(name));
127 if (it == m_indices.end())
129 "Can not find column with the name '" + std::string(name) +
"' in the tuple");
130 auto idx = it->second;
131 return m_pairs[idx].second;
142 [[nodiscard]] T
get(std::string_view name)
const {
154 void set(std::string_view name, T &&value) {
155 auto parsed_name = parse_name(name);
156 auto it = m_indices.find(parsed_name);
157 if (it != m_indices.end()) {
158 auto idx = it->second;
159 m_pairs[idx].second = std::forward<T>(value);
163 m_pairs.emplace_back(name, std::forward<T>(value));
164 m_indices.emplace(parsed_name, m_pairs.size() - 1);
173 [[nodiscard]]
const std::string &
column_name(uint32_t idx)
const {
174 if (idx > m_pairs.size()) {
176 "Index is too large: idx=" + std::to_string(idx) +
", columns_num=" + std::to_string(m_pairs.size()));
178 return m_pairs[idx].first;
189 auto it = m_indices.find(parse_name(name));
190 if (it == m_indices.end())
192 return std::int32_t(it->second);
203 std::vector<std::pair<std::string, primitive>> &&pairs, std::unordered_map<std::string, size_t> indices)
204 : m_pairs(std::move(pairs))
205 , m_indices(std::move(indices)) {}
213 [[nodiscard]]
static std::string parse_name(std::string_view name) {
214 if (name.size() >= 2 && name.front() ==
'"' && name.back() ==
'"')
215 name = name.substr(1, name.size() - 2);
218 throw ignite_error(
"Column name can not be an empty string");
221 res.reserve(name.size());
223 for (
auto c : name) {
224 res.push_back(
char(std::toupper(c)));
231 std::vector<std::pair<std::string, primitive>> m_pairs;
234 std::unordered_map<std::string, std::size_t> m_indices;
Definition ignite_error.h:35
Definition ignite_tuple.h:40
ignite_tuple(size_t capacity)
Definition ignite_tuple.h:52
std::int32_t column_count() const noexcept
Definition ignite_tuple.h:75
void set(uint32_t idx, T &&value)
Definition ignite_tuple.h:111
const std::string & column_name(uint32_t idx) const
Definition ignite_tuple.h:173
ignite_tuple(std::initializer_list< std::pair< std::string, primitive > > pairs)
Definition ignite_tuple.h:62
std::int32_t column_ordinal(std::string_view name) const
Definition ignite_tuple.h:188
const primitive & get(std::string_view name) const
Definition ignite_tuple.h:125
T get(std::string_view name) const
Definition ignite_tuple.h:142
const primitive & get(uint32_t idx) const
Definition ignite_tuple.h:83
void set(std::string_view name, T &&value)
Definition ignite_tuple.h:154
T get(uint32_t idx) const
Definition ignite_tuple.h:99
Definition primitive.h:43