88from substrait .utils import (
99 type_num_names ,
1010 merge_extension_urns ,
11+ merge_extension_uris ,
1112 merge_extension_declarations ,
1213)
1314from substrait .type_inference import infer_extended_expression_schema
@@ -229,26 +230,44 @@ def resolve(
229230 if not func :
230231 raise Exception (f"Unknown function { function } for { signature } " )
231232
233+ # Create URN extension
232234 func_extension_urns = [
233235 ste .SimpleExtensionURN (
234236 extension_urn_anchor = registry .lookup_urn (urn ), urn = urn
235237 )
236238 ]
237239
240+ # Create URI extension (convert URN to URI via bimap)
241+ uri = registry .urn_to_uri (urn )
242+ func_extension_uris = []
243+ if uri :
244+ uri_anchor = registry .lookup_uri_anchor (uri )
245+ if uri_anchor :
246+ func_extension_uris = [
247+ ste .SimpleExtensionURI (extension_uri_anchor = uri_anchor , uri = uri )
248+ ]
249+
250+ # Create extension function declaration with both URI and URN references
238251 func_extensions = [
239252 ste .SimpleExtensionDeclaration (
240253 extension_function = ste .SimpleExtensionDeclaration .ExtensionFunction (
241254 extension_urn_reference = registry .lookup_urn (urn ),
255+ extension_uri_reference = registry .lookup_uri_anchor (uri ) if uri else 0 ,
242256 function_anchor = func [0 ].anchor ,
243257 name = str (func [0 ]),
244258 )
245259 )
246260 ]
247261
262+ # Merge extensions from all expressions
248263 extension_urns = merge_extension_urns (
249264 func_extension_urns , * [b .extension_urns for b in bound_expressions ]
250265 )
251266
267+ extension_uris = merge_extension_uris (
268+ func_extension_uris , * [b .extension_uris for b in bound_expressions ]
269+ )
270+
252271 extensions = merge_extension_declarations (
253272 func_extensions , * [b .extensions for b in bound_expressions ]
254273 )
@@ -277,6 +296,7 @@ def resolve(
277296 ],
278297 base_schema = base_schema ,
279298 extension_urns = extension_urns ,
299+ extension_uris = extension_uris ,
280300 extensions = extensions ,
281301 )
282302
@@ -309,26 +329,44 @@ def resolve(
309329 if not func :
310330 raise Exception (f"Unknown function { function } for { signature } " )
311331
332+ # Create URN extension
312333 func_extension_urns = [
313334 ste .SimpleExtensionURN (
314335 extension_urn_anchor = registry .lookup_urn (urn ), urn = urn
315336 )
316337 ]
317338
339+ # Create URI extension (convert URN to URI via bimap)
340+ uri = registry .urn_to_uri (urn )
341+ func_extension_uris = []
342+ if uri :
343+ uri_anchor = registry .lookup_uri_anchor (uri )
344+ if uri_anchor :
345+ func_extension_uris = [
346+ ste .SimpleExtensionURI (extension_uri_anchor = uri_anchor , uri = uri )
347+ ]
348+
349+ # Create extension function declaration with both URI and URN references
318350 func_extensions = [
319351 ste .SimpleExtensionDeclaration (
320352 extension_function = ste .SimpleExtensionDeclaration .ExtensionFunction (
321353 extension_urn_reference = registry .lookup_urn (urn ),
354+ extension_uri_reference = registry .lookup_uri_anchor (uri ) if uri else 0 ,
322355 function_anchor = func [0 ].anchor ,
323356 name = str (func [0 ]),
324357 )
325358 )
326359 ]
327360
361+ # Merge extensions from all expressions
328362 extension_urns = merge_extension_urns (
329363 func_extension_urns , * [b .extension_urns for b in bound_expressions ]
330364 )
331365
366+ extension_uris = merge_extension_uris (
367+ func_extension_uris , * [b .extension_uris for b in bound_expressions ]
368+ )
369+
332370 extensions = merge_extension_declarations (
333371 func_extensions , * [b .extensions for b in bound_expressions ]
334372 )
@@ -353,6 +391,7 @@ def resolve(
353391 ],
354392 base_schema = base_schema ,
355393 extension_urns = extension_urns ,
394+ extension_uris = extension_uris ,
356395 extensions = extensions ,
357396 )
358397
@@ -391,28 +430,48 @@ def resolve(
391430 if not func :
392431 raise Exception (f"Unknown function { function } for { signature } " )
393432
433+ # Create URN extension
394434 func_extension_urns = [
395435 ste .SimpleExtensionURN (
396436 extension_urn_anchor = registry .lookup_urn (urn ), urn = urn
397437 )
398438 ]
399439
440+ # Create URI extension (convert URN to URI via bimap)
441+ uri = registry .urn_to_uri (urn )
442+ func_extension_uris = []
443+ if uri :
444+ uri_anchor = registry .lookup_uri_anchor (uri )
445+ if uri_anchor :
446+ func_extension_uris = [
447+ ste .SimpleExtensionURI (extension_uri_anchor = uri_anchor , uri = uri )
448+ ]
449+
450+ # Create extension function declaration with both URI and URN references
400451 func_extensions = [
401452 ste .SimpleExtensionDeclaration (
402453 extension_function = ste .SimpleExtensionDeclaration .ExtensionFunction (
403454 extension_urn_reference = registry .lookup_urn (urn ),
455+ extension_uri_reference = registry .lookup_uri_anchor (uri ) if uri else 0 ,
404456 function_anchor = func [0 ].anchor ,
405457 name = str (func [0 ]),
406458 )
407459 )
408460 ]
409461
462+ # Merge extensions from all expressions
410463 extension_urns = merge_extension_urns (
411464 func_extension_urns ,
412465 * [b .extension_urns for b in bound_expressions ],
413466 * [b .extension_urns for b in bound_partitions ],
414467 )
415468
469+ extension_uris = merge_extension_uris (
470+ func_extension_uris ,
471+ * [b .extension_uris for b in bound_expressions ],
472+ * [b .extension_uris for b in bound_partitions ],
473+ )
474+
416475 extensions = merge_extension_declarations (
417476 func_extensions ,
418477 * [b .extensions for b in bound_expressions ],
@@ -446,6 +505,7 @@ def resolve(
446505 ],
447506 base_schema = base_schema ,
448507 extension_urns = extension_urns ,
508+ extension_uris = extension_uris ,
449509 extensions = extensions ,
450510 )
451511
0 commit comments