30#include <unordered_map>
31#include <unordered_set>
44struct SchemaReassignIdContext;
53 static constexpr int32_t kInitialSchemaId = 0;
54 static constexpr int32_t kInitialColumnId = 0;
55 static constexpr int32_t kInvalidColumnId = -1;
58 static constexpr std::string_view kAllColumns =
"*";
63 using GetId = std::function<int32_t(int32_t)>;
64 using IdMap = std::unordered_map<int32_t, int32_t>;
66 explicit Schema(std::vector<SchemaField> fields, int32_t schema_id = kInitialSchemaId,
80 std::vector<int32_t> identifier_field_ids,
92 std::vector<SchemaField> fields, int32_t schema_id,
93 const std::vector<std::string>& identifier_field_names,
GetId get_id = {});
111 int32_t field_id,
const Schema& schema,
112 const std::unordered_map<int32_t, int32_t>& id_to_parent);
137 std::string_view name,
bool case_sensitive =
true)
const;
144 int32_t field_id)
const;
167 bool case_sensitive =
true)
const;
176 const std::unordered_set<int32_t>& field_ids)
const;
207 friend bool operator==(
const Schema& lhs,
const Schema& rhs) {
return lhs.Equals(rhs); }
210 using StructType::Equals;
212 bool Equals(
const Schema& other)
const;
214 const int32_t schema_id_;
216 std::vector<int32_t> identifier_field_ids_;
217 std::unique_ptr<SchemaReassignIdContext> reassign_id_context_;
219 std::unique_ptr<SchemaCache> cache_;
228 std::unordered_map<int32_t, std::reference_wrapper<const SchemaField>>;
229 using IdToFieldMapRef = std::reference_wrapper<const IdToFieldMap>;
237 std::unordered_map<std::string, int32_t, StringHash, std::equal_to<>>
name_to_id;
245 using NameIdMapRef = std::reference_wrapper<const NameIdMap>;
247 using LowercaseNameToIdMap =
248 std::unordered_map<std::string, int32_t, StringHash, std::equal_to<>>;
249 using LowercaseNameToIdMapRef = std::reference_wrapper<const LowercaseNameToIdMap>;
251 using IdToPositionPathMap = std::unordered_map<int32_t, std::vector<size_t>>;
252 using IdToPositionPathMapRef = std::reference_wrapper<const IdToPositionPathMap>;
A schema for a Table.
Definition schema.h:51
static Result< std::unique_ptr< Schema > > Make(std::vector< SchemaField > fields, int32_t schema_id, const std::vector< std::string > &identifier_field_names, GetId get_id={})
Create a schema.
std::string ToString() const override
Get a user-readable string representation.
Result< std::unique_ptr< Schema > > Select(std::span< const std::string > names, bool case_sensitive=true) const
Creates a projected schema from selected field names.
static Status ValidateIdentifierFields(int32_t field_id, const Schema &schema, const std::unordered_map< int32_t, int32_t > &id_to_parent)
Validate that the identifier field with the given ID is valid for the schema.
Result< std::unique_ptr< Schema > > Project(const std::unordered_set< int32_t > &field_ids) const
Creates a projected schema from selected field IDs.
std::function< int32_t(int32_t)> GetId
Maps an original field ID to its reassigned ID.
Definition schema.h:63
Result< std::optional< std::string_view > > FindColumnNameById(int32_t field_id) const
Returns the canonical field name for the given id.
Result< std::optional< std::reference_wrapper< const SchemaField > > > FindFieldByName(std::string_view name, bool case_sensitive=true) const
Recursively find the SchemaField by field name.
const IdMap & IdsToReassigned() const
Return a map of original field IDs to reassigned field IDs.
Status Validate(int32_t format_version) const
Validate the schema for a given format version.
bool SameSchema(const Schema &other) const
Checks whether this schema is equivalent to another schema while ignoring the schema id.
int32_t schema_id() const
Get the schema ID.
Result< std::vector< std::string > > IdentifierFieldNames() const
Return the canonical field names of the identifier fields.
const IdMap & IdsToOriginal() const
Return a map of reassigned field IDs to original field IDs.
Result< std::optional< std::reference_wrapper< const SchemaField > > > FindFieldById(int32_t field_id) const
Recursively find the SchemaField by field id.
const std::vector< int32_t > & IdentifierFieldIds() const
Return the field IDs of the identifier fields.
static const std::shared_ptr< Schema > & EmptySchema()
Get an empty schema.
Result< std::unique_ptr< StructLikeAccessor > > GetAccessorById(int32_t field_id) const
Get the accessor to access the field by field id.
Result< int32_t > HighestFieldId() const
Get the highest field ID in the schema.
static Result< std::unique_ptr< Schema > > Make(std::vector< SchemaField > fields, int32_t schema_id, std::vector< int32_t > identifier_field_ids, GetId get_id={})
Create a schema.
A data type representing a struct with nested fields.
Definition type.h:119
Define symbol visibility macros for core Iceberg APIs.
Core Apache Iceberg C++ APIs.
Definition arrow_io_util.h:33
std::expected< T, E > Result
Result alias.
Definition result.h:88
Define Result, Status, and error helpers.
Provide string utility helpers.
std::unordered_map< int32_t, std::string > id_to_name
Mapping from field ID to canonical name.
Definition schema.h:243
std::unordered_map< std::string, int32_t, StringHash, std::equal_to<> > name_to_id
Mapping from canonical field name to ID.
Definition schema.h:237