| 43 | // and so this utility is templated to support both. |
| 44 | template <typename MessageType> |
| 45 | Result<ExtensionSet> GetExtensionSetFromMessage( |
| 46 | const MessageType& message, const ConversionOptions& conversion_options, |
| 47 | const ExtensionIdRegistry* registry) { |
| 48 | if (registry == NULLPTR) { |
| 49 | registry = default_extension_id_registry(); |
| 50 | } |
| 51 | std::unordered_map<uint32_t, std::string_view> uris; |
| 52 | uris.reserve(message.extension_uris_size()); |
| 53 | for (const auto& uri : message.extension_uris()) { |
| 54 | uris[uri.extension_uri_anchor()] = uri.uri(); |
| 55 | } |
| 56 | |
| 57 | // NOTE: it's acceptable to use views to memory owned by message; ExtensionSet::Make |
| 58 | // will only store views to memory owned by registry. |
| 59 | |
| 60 | std::unordered_map<uint32_t, Id> type_ids, function_ids; |
| 61 | for (const auto& ext : message.extensions()) { |
| 62 | switch (ext.mapping_type_case()) { |
| 63 | case substrait::extensions::SimpleExtensionDeclaration::kExtensionTypeVariation: { |
| 64 | return Status::NotImplemented("Type Variations are not yet implemented"); |
| 65 | } |
| 66 | |
| 67 | case substrait::extensions::SimpleExtensionDeclaration::kExtensionType: { |
| 68 | const auto& type = ext.extension_type(); |
| 69 | std::string_view uri = uris[type.extension_uri_reference()]; |
| 70 | type_ids[type.type_anchor()] = Id{uri, type.name()}; |
| 71 | break; |
| 72 | } |
| 73 | |
| 74 | case substrait::extensions::SimpleExtensionDeclaration::kExtensionFunction: { |
| 75 | const auto& fn = ext.extension_function(); |
| 76 | std::string_view uri = uris[fn.extension_uri_reference()]; |
| 77 | function_ids[fn.function_anchor()] = Id{uri, fn.name()}; |
| 78 | break; |
| 79 | } |
| 80 | |
| 81 | default: |
| 82 | Unreachable(); |
| 83 | } |
| 84 | } |
| 85 | |
| 86 | return ExtensionSet::Make(std::move(uris), std::move(type_ids), std::move(function_ids), |
| 87 | conversion_options, registry); |
| 88 | } |
| 89 | |
| 90 | template <typename Message> |
| 91 | Status AddExtensionSetToMessage(const ExtensionSet& ext_set, Message* message) { |
no test coverage detected