51 static constexpr int32_t kInitialSchemaId = 0;
52 static constexpr int32_t kInitialColumnId = 0;
53 static constexpr int32_t kInvalidColumnId = -1;
56 static constexpr std::string_view kAllColumns =
"*";
58 explicit Schema(std::vector<SchemaField> fields, int32_t schema_id = kInitialSchemaId);
66 static Result<std::unique_ptr<Schema>> Make(std::vector<SchemaField> fields,
68 std::vector<int32_t> identifier_field_ids);
77 static Result<std::unique_ptr<Schema>> Make(
78 std::vector<SchemaField> fields, int32_t schema_id,
79 const std::vector<std::string>& identifier_field_names);
96 static Status ValidateIdentifierFields(
97 int32_t field_id,
const Schema& schema,
98 const std::unordered_map<int32_t, int32_t>& id_to_parent);
103 static const std::shared_ptr<Schema>& EmptySchema();
109 int32_t schema_id()
const;
111 std::string ToString()
const override;
122 Result<std::optional<std::reference_wrapper<const SchemaField>>> FindFieldByName(
123 std::string_view name,
bool case_sensitive =
true)
const;
129 Result<std::optional<std::reference_wrapper<const SchemaField>>> FindFieldById(
130 int32_t field_id)
const;
137 Result<std::optional<std::string_view>> FindColumnNameById(int32_t field_id)
const;
143 Result<std::unique_ptr<StructLikeAccessor>> GetAccessorById(int32_t field_id)
const;
152 Result<std::unique_ptr<Schema>> Select(std::span<const std::string> names,
153 bool case_sensitive =
true)
const;
161 Result<std::unique_ptr<Schema>> Project(
162 const std::unordered_set<int32_t>& field_ids)
const;
165 const std::vector<int32_t>& IdentifierFieldIds()
const;
168 Result<std::vector<std::string>> IdentifierFieldNames()
const;
172 Result<int32_t> HighestFieldId()
const;
176 bool SameSchema(
const Schema& other)
const;
185 Status Validate(int32_t format_version)
const;
187 friend bool operator==(
const Schema& lhs,
const Schema& rhs) {
return lhs.Equals(rhs); }
190 using StructType::Equals;
192 bool Equals(
const Schema& other)
const;
194 const int32_t schema_id_;
196 std::vector<int32_t> identifier_field_ids_;
198 std::unique_ptr<SchemaCache> cache_;
207 std::unordered_map<int32_t, std::reference_wrapper<const SchemaField>>;
208 using IdToFieldMapRef = std::reference_wrapper<const IdToFieldMap>;
216 std::unordered_map<std::string, int32_t, StringHash, std::equal_to<>>
name_to_id;
224 using NameIdMapRef = std::reference_wrapper<const NameIdMap>;
226 using LowercaseNameToIdMap =
227 std::unordered_map<std::string, int32_t, StringHash, std::equal_to<>>;
228 using LowercaseNameToIdMapRef = std::reference_wrapper<const LowercaseNameToIdMap>;
230 using IdToPositionPathMap = std::unordered_map<int32_t, std::vector<size_t>>;
231 using IdToPositionPathMapRef = std::reference_wrapper<const IdToPositionPathMap>;
233 Result<IdToFieldMapRef> GetIdToFieldMap()
const;
234 Result<NameIdMapRef> GetNameIdMap()
const;
235 Result<LowercaseNameToIdMapRef> GetLowercaseNameToIdMap()
const;
236 Result<IdToPositionPathMapRef> GetIdToPositionPathMap()
const;
237 Result<int32_t> GetHighestFieldId()
const;
240 static Result<IdToFieldMap> InitIdToFieldMap(
const Schema* schema);
241 static Result<NameIdMap> InitNameIdMap(
const Schema* schema);
242 static Result<LowercaseNameToIdMap> InitLowerCaseNameToIdMap(
const Schema* schema);
243 static Result<IdToPositionPathMap> InitIdToPositionPath(
const Schema* schema);
244 static Result<int32_t> InitHighestFieldId(
const Schema* schema);
248 Lazy<InitIdToFieldMap> id_to_field_;
250 Lazy<InitNameIdMap> name_id_map_;
252 Lazy<InitLowerCaseNameToIdMap> lowercase_name_to_id_;
254 Lazy<InitIdToPositionPath> id_to_position_path_;
256 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:216