Loading [MathJax]/extensions/tex2jax.js
LSST Applications g04a91732dc+a777afbe81,g07dc498a13+7e3c5f68a2,g12483e3c20+0145ec33cd,g1409bbee79+7e3c5f68a2,g1a7e361dbc+7e3c5f68a2,g1fd858c14a+9f35e23ec3,g35bb328faa+fcb1d3bbc8,g3ad4f90e5c+0145ec33cd,g3bd4b5ce2c+cbf1bea503,g4e0f332c67+5d362be553,g53246c7159+fcb1d3bbc8,g5477a8d5ce+db04660fe6,g60b5630c4e+0145ec33cd,g623d845a50+0145ec33cd,g6f0c2978f1+3526b51a37,g75b6c65c88+d54b601591,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g8852436030+4639f750a5,g89139ef638+7e3c5f68a2,g9125e01d80+fcb1d3bbc8,g919ac25b3e+6220c5324a,g95236ca021+f7a31438ed,g989de1cb63+7e3c5f68a2,g9f33ca652e+2d6fa11d35,gaaedd4e678+7e3c5f68a2,gabe3b4be73+1e0a283bba,gb1101e3267+4a428ef779,gb4a253aaf5+0122250889,gb58c049af0+f03b321e39,gc99c83e5f0+76d20ab76d,gcf25f946ba+4639f750a5,gd6cbbdb0b4+c8606af20c,gde0f65d7ad+3d8a3b7e46,ge278dab8ac+932305ba37,gf795337580+03b96afe58,gfba249425e+fcb1d3bbc8,w.2025.08
LSST Data Management Base Package
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
SchemaMapper.h
Go to the documentation of this file.
1// -*- lsst-c++ -*-
2#ifndef AFW_TABLE_SchemaMapper_h_INCLUDED
3#define AFW_TABLE_SchemaMapper_h_INCLUDED
4
5#include <memory>
6
8
9namespace lsst {
10namespace afw {
11namespace table {
12
13class BaseRecord;
14
21class SchemaMapper final {
22public:
24 Schema const getInputSchema() const { return _impl->_input; }
25
27 Schema const getOutputSchema() const { return _impl->_output; }
28
30 Schema& editOutputSchema() { return _impl->_output; }
31
33 template <typename T>
34 Key<T> addOutputField(Field<T> const& newField, bool doReplace = false) {
35 return _impl->_output.addField(newField, doReplace);
36 }
37
48 template <typename T>
49 Key<T> addMapping(Key<T> const& inputKey, bool doReplace = false);
50
61 template <typename T>
62 Key<T> addMapping(Key<T> const& inputKey, Field<T> const& outputField, bool doReplace = false);
63
74 template <typename T>
75 Key<T> addMapping(Key<T> const& inputKey, std::string const& outputName, bool doReplace = true);
76
82 template <typename T>
83 Key<T> addMapping(Key<T> const& inputKey, char const* outputName, bool doReplace = true) = delete;
84
97 template <typename Predicate>
98 void addMappingsWhere(Predicate predicate, bool doReplace = true);
99
110 void addMinimalSchema(Schema const& minimal, bool doMap = true);
111
122 static SchemaMapper removeMinimalSchema(Schema const& input, Schema const& minimal);
123
125 void invert();
126
128 template <typename T>
129 bool isMapped(Key<T> const& inputKey) const;
130
132 template <typename T>
133 Key<T> getMapping(Key<T> const& inputKey) const;
134
136
149 template <typename F>
150 void forEach(F& func) const {
151 for (auto const & item : _impl->_map) {
152 std::visit([&func](auto const & pair) { func(pair.first, pair.second); }, item);
153 }
154 }
155 template <typename F>
156 void forEach(F const& func) const {
157 for (auto const & item : _impl->_map) {
158 std::visit([&func](auto const & pair) { func(pair.first, pair.second); }, item);
159 }
160 }
161
162
164 explicit SchemaMapper();
165
181 explicit SchemaMapper(Schema const& input, Schema const& output);
182
200 explicit SchemaMapper(Schema const& input, bool shareAliasMap = false);
201
203 SchemaMapper(SchemaMapper const& other);
204 SchemaMapper(SchemaMapper&& other);
205
207 SchemaMapper& operator=(SchemaMapper const& other);
209
211
222 std::vector<Schema> const& inputs,
224
225private:
226 template <typename Predicate>
227 struct AddMappingsWhere {
228 template <typename T>
229 void operator()(SchemaItem<T> const& item) const {
230 if (predicate(item)) mapper->addMapping(item.key, doReplace);
231 }
232
233 AddMappingsWhere(SchemaMapper* mapper_, Predicate predicate_, bool doReplace_)
234 : mapper(mapper_), predicate(predicate_), doReplace(doReplace_) {}
235
236 SchemaMapper* mapper;
237 Predicate predicate;
238 bool doReplace;
239 };
240
241 using Impl = detail::SchemaMapperImpl;
242
244};
245
246template <typename Predicate>
247void SchemaMapper::addMappingsWhere(Predicate predicate, bool doReplace) {
248 _impl->_input.forEach(AddMappingsWhere<Predicate>(this, predicate, doReplace));
249}
250} // namespace table
251} // namespace afw
252} // namespace lsst
253
254#endif // !AFW_TABLE_SchemaMapper_h_INCLUDED
Base class for all records.
Definition BaseRecord.h:31
A class used as a handle to a particular field in a table.
Definition Key.h:53
Defines the fields and offsets for a table.
Definition Schema.h:51
A mapping between the keys of two Schemas, used to copy data between them.
Schema const getOutputSchema() const
Return the output schema (copy-on-write).
SchemaMapper()
Construct an empty mapper; useless unless you assign a fully-constructed one to it.
SchemaMapper & operator=(SchemaMapper const &other)
Assignment (copy-on-write).
Key< T > addMapping(Key< T > const &inputKey, char const *outputName, bool doReplace=true)=delete
This deliberately deleted overload ensures we don't accidentally cast string literals to bool.
void forEach(F &func) const
Call the given functor for each key pair in the mapper.
Key< T > addOutputField(Field< T > const &newField, bool doReplace=false)
Add a new field to the output Schema that is not connected to the input Schema.
Key< T > addMapping(Key< T > const &inputKey, bool doReplace=false)
Add a new field to the output Schema that is a copy of a field in the input Schema.
static SchemaMapper removeMinimalSchema(Schema const &input, Schema const &minimal)
Create a mapper by removing fields from the front of a schema.
static std::vector< SchemaMapper > join(std::vector< Schema > const &inputs, std::vector< std::string > const &prefixes=std::vector< std::string >())
Combine a sequence of schemas into one, creating a SchemaMapper for each.
void forEach(F const &func) const
Schema & editOutputSchema()
Return a reference to the output schema that allows it to be modified in place.
Key< T > getMapping(Key< T > const &inputKey) const
Return the output Key corresponding to the given input Key, or raise NotFoundError.
bool isMapped(Key< T > const &inputKey) const
Return true if the given input Key is mapped to an output Key.
void addMinimalSchema(Schema const &minimal, bool doMap=true)
Add the given minimal schema to the output schema.
void invert()
Swap the input and output schemas in-place.
Schema const getInputSchema() const
Return the input schema (copy-on-write).
void addMappingsWhere(Predicate predicate, bool doReplace=true)
Add mappings for all fields that match criteria defined by a predicate.
A description of a field in a table.
Definition Field.h:24
A simple pair-like struct for mapping a Field (name and description) with a Key (used for actual data...
Definition SchemaImpl.h:22