24 ColumnarTool<ColumnarModeArray> ::
26 :
m_data (std::make_shared<ColumnarToolDataArray> ())
29 m_data->sharedTools.push_back (
this);
42 ColumnarTool<ColumnarModeArray> ::
43 ColumnarTool (ColumnarTool<ColumnarModeArray>* val_parent)
50 ColumnarTool<ColumnarModeArray> ::
53 if (
m_data->mainTool ==
this)
54 m_data->mainTool =
nullptr;
61 void ColumnarTool<ColumnarModeArray> ::
62 addSubtool (ColumnarTool<ColumnarModeArray>& subtool)
67 auto subtoolData = subtool.m_data;
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)
99 m_data->sharedTools.insert (
m_data->sharedTools.end(), subtoolData->sharedTools.begin(), subtoolData->sharedTools.end());
100 for (
auto&
tool : subtoolData->sharedTools)
109 return StatusCode::SUCCESS;
114 void ColumnarTool<ColumnarModeArray> ::
115 callVoid (
void **
data)
const
118 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> (
data, eventsOffset[0], eventsOffset[1]));
123 std::vector<ColumnInfo> ColumnarTool<ColumnarModeArray> ::
124 getColumnInfo ()
const
126 std::vector<std::pair<std::string,std::string>>
names;
133 std::sort (
names.begin(),
names.end(), [] (
const auto&
a,
const auto&
b) { return a.second < b.second; });
135 std::vector<ColumnInfo>
result;
142 info.offsetName =
m_data->convertInternalToUserName (
info.offsetName);
143 info.replacesColumn =
m_data->convertInternalToUserName (
info.replacesColumn);
144 for (
auto& targetName :
info.linkTargetNames)
145 targetName =
m_data->convertInternalToUserName (targetName);
146 info.variantLinkKeyColumn =
m_data->convertInternalToUserName (
info.variantLinkKeyColumn);
157 void ColumnarTool<ColumnarModeArray> ::
158 renameColumn (
const std::string& from,
const std::string&
to)
160 if (
auto iter =
m_data->columnUserToInternalNames.find (from);
161 iter !=
m_data->columnUserToInternalNames.end())
163 for (
auto& internalName :
iter->second)
164 m_data->columnInternalToUserNames[internalName] =
to;
165 auto internalNames =
iter->second;
166 m_data->columnUserToInternalNames.erase (
iter);
167 m_data->columnUserToInternalNames[
to].insert (
m_data->columnUserToInternalNames[
to].end(), internalNames.begin(), internalNames.end());
171 auto internalNames =
m_data->convertUserToInternalNames (from);
172 m_data->columnUserToInternalNames[
to].insert (
m_data->columnUserToInternalNames[
to].end(), internalNames.begin(), internalNames.end());
173 for (
auto& internalName : internalNames)
174 m_data->columnInternalToUserNames[internalName] =
to;
179 void ColumnarTool<ColumnarModeArray> ::
180 setColumnIndex (
const std::string&
name, std::size_t
index)
182 auto internalNames =
m_data->convertUserToInternalNames (
name);
184 for (
auto& internalName : internalNames)
194 throw std::runtime_error (
"column not found: " +
name);
199 void ColumnarTool<ColumnarModeArray> ::
200 callEvents (ObjectRange<ContainerId::eventContext,ColumnarModeArray> )
const
202 throw std::runtime_error (
"tool didn't implement callEvents");
207 void ColumnarTool<ColumnarModeArray> ::
208 setContainerUserName (std::string_view container,
const std::string&
name)
210 auto [
iter, success] =
m_data->containerInternalToUserNames.emplace (container,
name);
211 if (!success &&
iter->second !=
name)
212 throw std::runtime_error (
"container already registered with different name: " +
name +
" vs " +
iter->second);
213 m_data->containerUserToInternalNames[
name].emplace_back (container);
218 void ColumnarTool<ColumnarModeArray> ::
219 addColumn (
const std::string&
name, ColumnAccessorDataArray *accessorData, ColumnInfo&&
info)
221 info.type = accessorData->type;
222 info.accessMode = accessorData->accessMode;
231 : m_info (std::move (
other.m_info))
232 , m_accessors (std::move (
other.m_accessors))
234 for (
auto *
ptr : m_accessors)
248 if (
ptr->dataRef ==
this)
249 ptr->dataRef =
nullptr;
285 throw std::runtime_error (
"multiple types for column: " +
name);
293 throw std::runtime_error (
"inconsistent offset map for column: " +
name);
296 if (val_accessorData)
299 val_accessorData->
dataRef =
this;
312 val_accessorData.
dataRef =
nullptr;
325 other.m_accessors.clear();
333 m_info.index =
index;
334 for (
auto *
ptr : m_accessors)
344 return std::string{};
349 if (
split == std::string::npos)
351 auto containerName =
name.substr (0,
split);
354 return std::string (
name);
367 if (
split == std::string::npos)
369 auto containerName =
name.substr (0,
split);
372 return {std::string (
name)};
373 std::vector<std::string>
result;
374 for (
auto& internalContainerName :
iter->second)
375 result.push_back (internalContainerName + std::string (
name.substr (
split)));