@@ -100,7 +100,10 @@ class PlatformFunctionsManager:
100100def __init__ (self ):
101101self ._parsers_map :dict [str ,HigherOrderFunctionParser ]= {}
102102self ._renders_map :dict [str ,FunctionRender ]= {}
103+ self ._in_query_renders_map :dict [str ,FunctionRender ]= {}
103104self ._names_map :dict [str ,str ]= {}
105+ self ._order_to_render :dict [str ,int ]= {}
106+ self ._render_to_prefix_functions :list [str ]= []
104107
105108def post_init_configure (self ,platform_render :PlatformQueryRender )-> None :
106109raise NotImplementedError
@@ -121,6 +124,12 @@ def get_render(self, generic_func_name: str) -> FunctionRender:
121124
122125raise 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+
124133def get_generic_func_name (self ,platform_func_name :str )-> Optional [str ]:
125134if INIT_FUNCTIONS and (generic_func_name := self ._names_map .get (platform_func_name )):
126135return generic_func_name
@@ -131,6 +140,20 @@ def get_platform_func_name(self, generic_func_name: str) -> Optional[str]:
131140if INIT_FUNCTIONS :
132141return 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 :
136159manager :PlatformFunctionsManager = PlatformFunctionsManager ()
@@ -158,18 +181,27 @@ def parse(self, query: str) -> ParsedFunctions:
158181invalid = 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+
161187def render (self ,functions :list [Function ],source_mapping :SourceMapping )-> RenderedFunctions :
162188rendered = ""
189+ rendered_prefix = ""
163190not_supported = []
191+ functions = self ._sort_functions_to_render (functions )
164192for func in functions :
165193try :
166194func_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 )
168200except NotSupportedFunctionException :
169201not_supported .append (func .raw )
170202
171203not_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
174206def wrap_function_with_delimiter (self ,func :str )-> str :
175207return f"{ self .function_delimiter } { func } "