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 for (
auto& targetName :
info.linkTargetNames)
141 targetName = m_data->convertInternalToUserName (targetName);
142 info.variantLinkKeyColumn = m_data->convertInternalToUserName (
info.variantLinkKeyColumn);
144 result.push_back (std::move(info));
153 void ColumnarToolArray ::
154 renameColumn (
const std::string& from,
const std::string& to)
156 if (
auto iter = m_data->columnUserToInternalNames.find (from);
157 iter != m_data->columnUserToInternalNames.end())
159 for (
auto& internalName :
iter->second)
160 m_data->columnInternalToUserNames[internalName] =
to;
161 auto internalNames =
iter->second;
162 m_data->columnUserToInternalNames.erase (iter);
163 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
167 auto internalNames = m_data->convertUserToInternalNames (from);
168 if (internalNames.empty())
169 throw std::runtime_error (
"column not found for rename: " + from);
170 m_data->columnUserToInternalNames[
to].insert (m_data->columnUserToInternalNames[to].end(), internalNames.begin(), internalNames.end());
171 for (
auto& internalName : internalNames)
172 m_data->columnInternalToUserNames[internalName] =
to;
177 void ColumnarToolArray ::
178 setColumnIndex (
const std::string& name, std::size_t index)
180 auto internalNames = m_data->convertUserToInternalNames (name);
182 for (
auto& internalName : internalNames)
184 if (
auto column = m_data->columns.find (internalName);
185 column != m_data->columns.end() && !
column->second.empty())
187 column->second.setIndex (index);
192 throw std::runtime_error (
"column not found: " + name);
197 void ColumnarToolArray ::
198 setContainerUserName (std::string_view container,
const std::string& name)
200 auto [
iter, success] = m_data->containerInternalToUserNames.emplace (container, name);
201 if (!success &&
iter->second != name)
202 throw std::runtime_error (
"container already registered with different name: " + name +
" vs " +
iter->second);
203 m_data->containerUserToInternalNames[
name].emplace_back (container);
208 void ColumnarToolArray ::
211 info.type = accessorData->type;
212 info.accessMode = accessorData->accessMode;
214 m_data->columns[
name].addAccessor (name, info, accessorData);
217 if (!
info.offsetName.empty())
218 m_data->columns[
info.offsetName];
219 if (!
info.replacesColumn.empty())
220 m_data->columns[
info.replacesColumn];
221 for (
auto& targetName :
info.linkTargetNames)
222 m_data->columns[targetName];
223 if (!
info.variantLinkKeyColumn.empty())
224 m_data->columns[
info.variantLinkKeyColumn];
231 :
m_info (std::move (other.m_info))
236 if (ptr->dataRef == &other)
244 ~ColumnDataArray () noexcept
248 if (ptr->dataRef ==
this)
249 ptr->dataRef =
nullptr;
255 bool ColumnDataArray ::
256 empty ()
const noexcept
264 info ()
const noexcept
271 void ColumnDataArray ::
285 throw std::runtime_error (
"multiple types for column: " + name);
291 m_info.isOptional =
false;
293 throw std::runtime_error (
"inconsistent offset map for column: " + name);
296 if (val_accessorData)
299 val_accessorData->
dataRef =
this;
305 void ColumnDataArray ::
312 val_accessorData.
dataRef =
nullptr;
317 void ColumnDataArray ::
323 for (
auto *ptr : other.m_accessors)
325 other.m_accessors.clear();
330 void ColumnDataArray ::
331 setIndex (
unsigned index)
noexcept
335 *ptr->dataIndexPtr =
index;
340 std::string ColumnarToolDataArray ::
341 convertInternalToUserName (std::string_view name)
const
344 return std::string{};
348 auto split = name.find (
'.');
349 if (
split == std::string::npos)
351 auto containerName = name.substr (0,
split);
354 return std::string (name);
355 return iter->second + std::string (name.substr (
split));
360 std::vector<std::string> ColumnarToolDataArray ::
361 convertUserToInternalNames (std::string_view name)
const
366 auto split = name.find (
'.');
367 if (
split == std::string::npos)
369 auto containerName = name.substr (0,
split);
370 std::vector<std::string> result;
374 for (
auto& internalContainerName : iter->second)
376 std::string subname = internalContainerName + std::string (name.substr (
split));
378 result.push_back (std::move (subname));
382 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 ContainerId::name for the event context
@ 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