| 195 | } |
| 196 | |
| 197 | Result<DeclarationInfo> GetExtensionInfo(const substrait::Rel& rel, |
| 198 | const ExtensionSet& ext_set, |
| 199 | const ConversionOptions& conv_opts, |
| 200 | std::vector<DeclarationInfo>* inputs_arg) { |
| 201 | if (inputs_arg == nullptr) { |
| 202 | std::vector<DeclarationInfo> inputs_tmp; |
| 203 | return GetExtensionInfo(rel, ext_set, conv_opts, &inputs_tmp); |
| 204 | } |
| 205 | std::vector<DeclarationInfo>& inputs = *inputs_arg; |
| 206 | inputs.clear(); |
| 207 | switch (rel.rel_type_case()) { |
| 208 | case substrait::Rel::RelTypeCase::kExtensionLeaf: { |
| 209 | const auto& ext = rel.extension_leaf(); |
| 210 | DefaultExtensionDetails detail{ext.detail()}; |
| 211 | return conv_opts.extension_provider->MakeRel(conv_opts, inputs, detail, ext_set); |
| 212 | } |
| 213 | |
| 214 | case substrait::Rel::RelTypeCase::kExtensionSingle: { |
| 215 | const auto& ext = rel.extension_single(); |
| 216 | ARROW_ASSIGN_OR_RAISE(DeclarationInfo input_info, |
| 217 | FromProto(ext.input(), ext_set, conv_opts)); |
| 218 | inputs.push_back(std::move(input_info)); |
| 219 | DefaultExtensionDetails detail{ext.detail()}; |
| 220 | return conv_opts.extension_provider->MakeRel(conv_opts, inputs, detail, ext_set); |
| 221 | } |
| 222 | |
| 223 | case substrait::Rel::RelTypeCase::kExtensionMulti: { |
| 224 | const auto& ext = rel.extension_multi(); |
| 225 | for (const auto& input : ext.inputs()) { |
| 226 | ARROW_ASSIGN_OR_RAISE(auto input_info, FromProto(input, ext_set, conv_opts)); |
| 227 | inputs.push_back(std::move(input_info)); |
| 228 | } |
| 229 | DefaultExtensionDetails detail{ext.detail()}; |
| 230 | return conv_opts.extension_provider->MakeRel(conv_opts, inputs, detail, ext_set); |
| 231 | } |
| 232 | |
| 233 | default: { |
| 234 | return Status::Invalid("Invalid extension relation case ", rel.rel_type_case()); |
| 235 | } |
| 236 | } |
| 237 | } |
| 238 | |
| 239 | std::optional<substrait::RelCommon> GetExtensionRelCommon(const substrait::Rel& rel) { |
| 240 | switch (rel.rel_type_case()) { |