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,
78 static Result<std::unique_ptr<Schema>> Make(std::vector<SchemaField> fields,
80 std::vector<int32_t> identifier_field_ids,
91 static Result<std::unique_ptr<Schema>> Make(
92 std::vector<SchemaField> fields, int32_t schema_id,
93 const std::vector<std::string>& identifier_field_names, GetId get_id = {});
110 static Status ValidateIdentifierFields(
111 int32_t field_id,
const Schema& schema,
112 const std::unordered_map<int32_t, int32_t>& id_to_parent);
117 static const std::shared_ptr<Schema>& EmptySchema();
123 int32_t schema_id()
const;
125 std::string ToString()
const override;
136 Result<std::optional<std::reference_wrapper<const SchemaField>>> FindFieldByName(
137 std::string_view name,
bool case_sensitive =
true)
const;
143 Result<std::optional<std::reference_wrapper<const SchemaField>>> FindFieldById(
144 int32_t field_id)
const;
151 Result<std::optional<std::string_view>> FindColumnNameById(int32_t field_id)
const;
157 Result<std::unique_ptr<StructLikeAccessor>> GetAccessorById(int32_t field_id)
const;
166 Result<std::unique_ptr<Schema>> Select(std::span<const std::string> names,
167 bool case_sensitive =
true)
const;
175 Result<std::unique_ptr<Schema>> Project(
176 const std::unordered_set<int32_t>& field_ids)
const;
179 const std::vector<int32_t>& IdentifierFieldIds()
const;
182 const IdMap& IdsToReassigned()
const;
185 const IdMap& IdsToOriginal()
const;
188 Result<std::vector<std::string>> IdentifierFieldNames()
const;
192 Result<int32_t> HighestFieldId()
const;
196 bool SameSchema(
const Schema& other)
const;
205 Status Validate(int32_t format_version)
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>;
254 Result<IdToFieldMapRef> GetIdToFieldMap()
const;
255 Result<NameIdMapRef> GetNameIdMap()
const;
256 Result<LowercaseNameToIdMapRef> GetLowercaseNameToIdMap()
const;
257 Result<IdToPositionPathMapRef> GetIdToPositionPathMap()
const;
258 Result<int32_t> GetHighestFieldId()
const;
261 static Result<IdToFieldMap> InitIdToFieldMap(
const Schema* schema);
262 static Result<NameIdMap> InitNameIdMap(
const Schema* schema);
263 static Result<LowercaseNameToIdMap> InitLowerCaseNameToIdMap(
const Schema* schema);
264 static Result<IdToPositionPathMap> InitIdToPositionPath(
const Schema* schema);
265 static Result<int32_t> InitHighestFieldId(
const Schema* schema);
269 Lazy<InitIdToFieldMap> id_to_field_;
271 Lazy<InitNameIdMap> name_id_map_;
273 Lazy<InitLowerCaseNameToIdMap> lowercase_name_to_id_;
275 Lazy<InitIdToPositionPath> id_to_position_path_;
277 Lazy<InitHighestFieldId> highest_field_id_;
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