@@ -125,21 +125,20 @@ const std::shared_ptr<MetricsConfig>& MetricsConfig::Default() {
125125
126126Result<std::shared_ptr<MetricsConfig>> MetricsConfig::Make (const Table& table) {
127127 ICEBERG_ASSIGN_OR_RAISE (auto schema, table.schema ());
128- auto sort_order = table.sort_order ();
129- return MakeInternal (table.properties (), *schema,
130- *sort_order.value_or (SortOrder::Unsorted ()));
128+ auto order = table.sort_order ().value_or (SortOrder::Unsorted ());
129+ return MakeInternal (table.properties (), schema.get (), order.get ());
131130}
132131
133132Result<std::shared_ptr<MetricsConfig>> MetricsConfig::Make (
134133 std::unordered_map<std::string, std::string> properties) {
135134 // Create a minimal TableProperties wrapper for the properties
136135 TableProperties props = TableProperties::FromMap (std::move (properties));
137136
138- return MakeInternal (props, Schema ({}), * SortOrder::Unsorted () );
137+ return MakeInternal (props, /* schema= */ nullptr , /* order= */ nullptr );
139138}
140139
141140Result<std::shared_ptr<MetricsConfig>> MetricsConfig::MakeInternal (
142- const TableProperties& props, const Schema& schema, const SortOrder& order) {
141+ const TableProperties& props, const Schema* schema, const SortOrder* order) {
143142 ColumnModeMap column_modes;
144143
145144 MetricsMode default_mode = kDefaultMetricsMode ;
@@ -148,16 +147,16 @@ Result<std::shared_ptr<MetricsConfig>> MetricsConfig::MakeInternal(
148147 props.Get (TableProperties::kDefaultWriteMetricsMode );
149148 ICEBERG_ASSIGN_OR_RAISE (default_mode,
150149 ParseMode (configured_metrics_mode, kDefaultMetricsMode ));
151- } else {
150+ } else if (schema != nullptr ) {
152151 int32_t max_inferred_columns = MaxInferredColumns (props);
153152 GetProjectedIdsVisitor visitor (/* include_struct_ids=*/ true );
154- ICEBERG_RETURN_UNEXPECTED (visitor.Visit (schema));
153+ ICEBERG_RETURN_UNEXPECTED (visitor.Visit (* schema));
155154 auto projected_columns = static_cast <int32_t >(visitor.Finish ().size ());
156155 if (max_inferred_columns < projected_columns) {
157156 ICEBERG_ASSIGN_OR_RAISE (auto limit_field_ids,
158- LimitFieldIds (schema, max_inferred_columns));
157+ LimitFieldIds (* schema, max_inferred_columns));
159158 for (auto id : limit_field_ids) {
160- ICEBERG_ASSIGN_OR_RAISE (auto column_name, schema. FindColumnNameById (id));
159+ ICEBERG_ASSIGN_OR_RAISE (auto column_name, schema-> FindColumnNameById (id));
161160 ICEBERG_CHECK (column_name.has_value (), " Field id {} not found in schema" , id);
162161 column_modes[std::string (column_name.value ())] = kDefaultMetricsMode ;
163162 }
@@ -167,10 +166,12 @@ Result<std::shared_ptr<MetricsConfig>> MetricsConfig::MakeInternal(
167166 }
168167
169168 // First set sorted column with sorted column default (can be overridden by user)
170- auto sorted_col_default_mode = SortedColumnDefaultMode (default_mode);
171- auto sorted_columns = SortOrder::OrderPreservingSortedColumns (schema, order);
172- for (const auto & sorted_column : sorted_columns) {
173- column_modes[std::string (sorted_column)] = sorted_col_default_mode;
169+ if (schema != nullptr && order != nullptr ) {
170+ auto sorted_col_default_mode = SortedColumnDefaultMode (default_mode);
171+ auto sorted_columns = SortOrder::OrderPreservingSortedColumns (*schema, *order);
172+ for (const auto & sorted_column : sorted_columns) {
173+ column_modes[std::string (sorted_column)] = sorted_col_default_mode;
174+ }
174175 }
175176
176177 // Handle user overrides of defaults
0 commit comments