@@ -100,7 +100,10 @@ class PlatformFunctionsManager:
100100 def __init__ (self ):
101101 self ._parsers_map : dict [str , HigherOrderFunctionParser ] = {}
102102 self ._renders_map : dict [str , FunctionRender ] = {}
103+ self ._in_query_renders_map : dict [str , FunctionRender ] = {}
103104 self ._names_map : dict [str , str ] = {}
105+ self ._order_to_render : dict [str , int ] = {}
106+ self ._render_to_prefix_functions : list [str ] = []
104107
105108 def post_init_configure (self , platform_render : PlatformQueryRender ) -> None :
106109 raise NotImplementedError
@@ -121,6 +124,12 @@ def get_render(self, generic_func_name: str) -> FunctionRender:
121124
122125 raise NotSupportedFunctionException
123126
127+ def get_in_query_render (self , generic_func_name : str ) -> FunctionRender :
128+ if INIT_FUNCTIONS and (render := self ._in_query_renders_map .get (generic_func_name )):
129+ return render
130+
131+ raise NotSupportedFunctionException
132+
124133 def get_generic_func_name (self , platform_func_name : str ) -> Optional [str ]:
125134 if INIT_FUNCTIONS and (generic_func_name := self ._names_map .get (platform_func_name )):
126135 return generic_func_name
@@ -131,6 +140,20 @@ def get_platform_func_name(self, generic_func_name: str) -> Optional[str]:
131140 if INIT_FUNCTIONS :
132141 return self ._inverted_names_map .get (generic_func_name )
133142
143+ @property
144+ def order_to_render (self ) -> dict [str , int ]:
145+ if INIT_FUNCTIONS :
146+ return self ._order_to_render
147+
148+ return {}
149+
150+ @property
151+ def render_to_prefix_functions (self ) -> list [str ]:
152+ if INIT_FUNCTIONS :
153+ return self ._render_to_prefix_functions
154+
155+ return []
156+
134157
135158class PlatformFunctions :
136159 manager : PlatformFunctionsManager = PlatformFunctionsManager ()
@@ -158,18 +181,27 @@ def parse(self, query: str) -> ParsedFunctions:
158181 invalid = invalid ,
159182 )
160183
184+ def _sort_functions_to_render (self , functions : list [Function ]) -> list [Function ]:
185+ return sorted (functions , key = lambda func : self .manager .order_to_render .get (func .name , 0 ))
186+
161187 def render (self , functions : list [Function ], source_mapping : SourceMapping ) -> RenderedFunctions :
162188 rendered = ""
189+ rendered_prefix = ""
163190 not_supported = []
191+ functions = self ._sort_functions_to_render (functions )
164192 for func in functions :
165193 try :
166194 func_render = self .manager .get_render (func .name )
167- rendered += self .wrap_function_with_delimiter (func_render .render (func , source_mapping ))
195+ _rendered = func_render .render (func , source_mapping )
196+ if func .name in self .manager .render_to_prefix_functions :
197+ rendered_prefix += _rendered
198+ else :
199+ rendered += self .wrap_function_with_delimiter (_rendered )
168200 except NotSupportedFunctionException :
169201 not_supported .append (func .raw )
170202
171203 not_supported = [self .wrap_function_with_delimiter (func .strip ()) for func in not_supported ]
172- return RenderedFunctions (rendered = rendered , not_supported = not_supported )
204+ return RenderedFunctions (rendered_prefix = rendered_prefix , rendered = rendered , not_supported = not_supported )
173205
174206 def wrap_function_with_delimiter (self , func : str ) -> str :
175207 return f" { self .function_delimiter } { func } "
0 commit comments