25 ColumnarToolArray (ColumnarToolArray* val_parent)
27 if (val_parent ==
nullptr)
29 m_data = std::make_shared<ColumnarToolDataArray> ();
30 m_data->mainTool =
this;
31 m_data->sharedTools.push_back (
this);
38 m_data = val_parent->m_data;
39 m_data->sharedTools.push_back (
this);
51 if (m_data->mainTool ==
this)
52 m_data->mainTool =
nullptr;
54 auto iter = std::find (m_data->sharedTools.begin(), m_data->sharedTools.end(),
this);
55 if (iter != m_data->sharedTools.end())
56 m_data->sharedTools.erase (iter);
61 void ColumnarToolArray ::
62 addSubtool (ColumnarToolArray& subtool)
67 auto subtoolData = subtool.m_data;
69 if (m_data == subtoolData)
72 if (subtoolData->mainTool != &subtool)
73 throw std::runtime_error (
"subtool already has a different parent tool");
75 for (
auto& containerName : subtoolData->containerInternalToUserNames)
77 auto [
iter,success] = m_data->containerInternalToUserNames.emplace (containerName.first, containerName.second);
78 if (!success &&
iter->second != containerName.second)
79 throw std::runtime_error (
"container assigned different name in subtool: " +
iter->second +
" vs " + containerName.second);
81 m_data->containerUserToInternalNames[containerName.second].push_back (containerName.first);
83 for (
auto& columnName : subtoolData->columnInternalToUserNames)
85 auto [
iter,success] = m_data->columnInternalToUserNames.emplace (columnName.first, columnName.second);
86 if (!success &&
iter->second != columnName.second)
87 throw std::runtime_error (
"column assigned different name in subtool: " +
iter->second +
" vs " + columnName.second);
89 m_data->columnUserToInternalNames[columnName.second].push_back (columnName.first);
92 for (
auto& column : subtoolData->columns)
94 auto [
iter,success] = m_data->columns.try_emplace (
column.first, std::move (
column.second));
97 if (
iter->second.empty())
99 else if (!
column.second.empty())
104 m_data->sharedTools.insert (m_data->sharedTools.end(), subtoolData->sharedTools.begin(), subtoolData->sharedTools.end());
105 for (
auto& tool : subtoolData->sharedTools)
106 tool->m_data = m_data;
114 return StatusCode::SUCCESS;
119 std::vector<ColumnInfo> ColumnarToolArray ::
120 getColumnInfo ()
const
122 std::vector<std::pair<std::string,std::string>>
names;
123 names.reserve (m_data->columns.size());
124 for (
auto& [name, column] : m_data->columns)
127 names.emplace_back (name, m_data->convertInternalToUserName (name));
129 std::sort (
names.begin(),
names.end(), [] (
const auto&
a,
const auto& b) { return a.second < b.second; });
131 std::vector<ColumnInfo>
result;
133 for (
auto& name : names)
135 auto&
column = m_data->columns.at (
name.first);
138 info.offsetName = m_data->convertInternalToUserName (
info.offsetName);
139 info.replacesColumn = m_data->convertInternalToUserName (
info.replacesColumn);
140 info.soleLinkTargetName = m_data->convertInternalToUserName (
info.soleLinkTargetName);
141 for (
auto& targetName :
info.variantLinkTargetNames)
142 targetName = m_data->convertInternalToUserName (targetName);
143 info.keyColumnForVariantLink = m_data->convertInternalToUserName (
info.keyColumnForVariantLink);
145 result.push_back (std::move(info));
154 void ColumnarToolArray ::
155 renameColumn (
const std::string& from,
const std::string& to)
157 if (
auto iter = m_data->columnUserToInternalNames.find (from);
158 iter != m_data->columnUserToInternalNames.end())
160 for (
auto& internalName :
iter->second)
161 m_data->columnInternalToUserNames[internalName] =
to;
162 auto internalNames =
iter->second;
163 m_data->columnUserToInternalNames.erase (iter);
164 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
168 auto internalNames = m_data->convertUserToInternalNames (from);
169 if (internalNames.empty())
170 throw std::runtime_error (
"column not found for rename: " + from);
171 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
172 for (
auto& internalName : internalNames)
173 m_data->columnInternalToUserNames[internalName] =
to;
178 void ColumnarToolArray ::
179 setColumnIndex (
const std::string& name, std::size_t index)
181 auto internalNames = m_data->convertUserToInternalNames (name);
183 for (
auto& internalName : internalNames)
185 if (
auto column = m_data->columns.find (internalName);
186 column != m_data->columns.end() && !
column->second.empty())
188 column->second.setIndex (index);
193 throw std::runtime_error (
"column not found: " + name);
198 void ColumnarToolArray ::
199 setContainerUserName (std::string_view container,
const std::string& name)
201 auto [
iter, success] = m_data->containerInternalToUserNames.emplace (container, name);
202 if (!success &&
iter->second != name)
203 throw std::runtime_error (
"container already registered with different name: " + name +
" vs " +
iter->second);
204 m_data->containerUserToInternalNames[
name].emplace_back (container);
209 void ColumnarToolArray ::
212 info.type = accessorData->type;
213 info.accessMode = accessorData->accessMode;
215 m_data->columns[
name].addAccessor (name, info, accessorData);
218 if (!
info.offsetName.empty())
219 m_data->columns[
info.offsetName];
220 if (!
info.replacesColumn.empty())
221 m_data->columns[
info.replacesColumn];
222 if (!
info.soleLinkTargetName.empty())
223 m_data->columns[
info.soleLinkTargetName];
224 for (
auto& targetName :
info.variantLinkTargetNames)
225 m_data->columns[targetName];
226 if (!
info.keyColumnForVariantLink.empty())
227 m_data->columns[
info.keyColumnForVariantLink];
234 :
m_info (std::move (other.m_info))
239 if (ptr->dataRef == &other)
247 ~ColumnDataArray () noexcept
251 if (ptr->dataRef ==
this)
252 ptr->dataRef =
nullptr;
258 bool ColumnDataArray ::
259 empty ()
const noexcept
267 info ()
const noexcept
274 void ColumnDataArray ::
288 throw std::runtime_error (
"multiple types for column: " + name);
294 m_info.isOptional =
false;
296 throw std::runtime_error (
"inconsistent offset map for column: " + name);
299 if (val_accessorData)
302 val_accessorData->
dataRef =
this;
308 void ColumnDataArray ::
315 val_accessorData.
dataRef =
nullptr;
320 void ColumnDataArray ::
326 for (
auto *ptr : other.m_accessors)
328 other.m_accessors.clear();
333 void ColumnDataArray ::
334 setIndex (
unsigned index)
noexcept
338 *ptr->dataIndexPtr =
index;
343 std::string ColumnarToolDataArray ::
344 convertInternalToUserName (std::string_view name)
const
347 return std::string{};
351 auto split = name.find (
'.');
352 if (
split == std::string::npos)
354 auto containerName = name.substr (0,
split);
357 return std::string (name);
358 return iter->second + std::string (name.substr (
split));
363 std::vector<std::string> ColumnarToolDataArray ::
364 convertUserToInternalNames (std::string_view name)
const
369 auto split = name.find (
'.');
370 if (
split == std::string::npos)
372 auto containerName = name.substr (0,
split);
373 std::vector<std::string> result;
377 for (
auto& internalContainerName : iter->second)
379 std::string subname = internalContainerName + std::string (name.substr (
split));
381 result.push_back (std::move (subname));
385 result.push_back (std::string (name));
std::vector< std::string > split(const std::string &s, const std::string &t=":")
::StatusCode StatusCode
StatusCode definition for legacy code.
void mergeColumnInfo(ColumnInfo &target, const ColumnInfo &source)
constexpr std::string_view eventContextCIName
the name for the event context container id
@ update
an updateable column
const std::string eventRangeColumnName
the default name for the column containing the event range
std::size_t ColumnarOffsetType
the type used for the size and offsets in the columnar data
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
all the data about a column accessor that the ColumnarTool needs to know about
ColumnDataArray * dataRef
the ColumnDataArray object that holds us
ColumnDataArray() noexcept=default
standard constructor
std::vector< ColumnAccessorDataArray * > m_accessors
the data on all accessors for this column
ColumnInfo m_info
the column info
void addAccessor(const std::string &name, const ColumnInfo &val_info, ColumnAccessorDataArray *val_accessorData)
add an info to the column
a struct that contains meta-information about each column that's needed to interface the column with ...
std::string offsetName
the name of the offset column used for this column (or empty string for none)
bool isOptional
whether this column is optional
ColumnAccessMode accessMode
the access mode for the column
const std::type_info * type
the type of the individual entries in the column
static constexpr std::string_view idName