1616limitations under the License.
1717-----------------------------------------------------------------
1818"""
19+
1920from abc import ABC , abstractmethod
2021from collections .abc import Callable
21- from typing import Optional , Union
22+ from typing import ClassVar , Optional , Union
2223
2324from app .translator .const import DEFAULT_VALUE_TYPE
25+ from app .translator .core .context_vars import return_only_first_query_ctx_var
2426from app .translator .core .custom_types .tokens import LogicalOperatorType , OperatorType
2527from app .translator .core .custom_types .values import ValueType
2628from app .translator .core .escape_manager import EscapeManager
@@ -164,7 +166,14 @@ class QueryRender(ABC):
164166 is_single_line_comment : bool = False
165167 unsupported_functions_text = "Unsupported functions were excluded from the result query:"
166168
167- platform_functions : PlatformFunctions = PlatformFunctions ()
169+ platform_functions : PlatformFunctions = None
170+
171+ def __init__ (self ):
172+ self .init_platform_functions ()
173+
174+ def init_platform_functions (self ) -> None :
175+ self .platform_functions = PlatformFunctions ()
176+ self .platform_functions .platform_query_render = self
168177
169178 def render_not_supported_functions (self , not_supported_functions : list ) -> str :
170179 line_template = f"{ self .comment_symbol } " if self .comment_symbol and self .is_single_line_comment else ""
@@ -192,9 +201,10 @@ class PlatformQueryRender(QueryRender):
192201 field_value_map = BaseQueryFieldValue (or_token = or_token )
193202
194203 query_pattern = "{prefix}{query}{functions}"
195- raw_log_field_pattern : str = None
204+ raw_log_field_pattern_map : ClassVar [ dict [ str , str ]] = None
196205
197206 def __init__ (self ):
207+ super ().__init__ ()
198208 self .operator_map = {
199209 LogicalOperatorType .AND : f" { self .and_token } " ,
200210 LogicalOperatorType .OR : f" { self .or_token } " ,
@@ -288,7 +298,8 @@ def finalize_query(
288298 * args , # noqa: ARG002
289299 ** kwargs , # noqa: ARG002
290300 ) -> str :
291- query = self .query_concatenation (prefix = prefix , search = query , functions = functions )
301+ query = self .query_pattern .format (prefix = prefix , query = query , functions = functions ).strip ()
302+
292303 query = self .wrap_query_with_meta_info (meta_info = meta_info , query = query )
293304 if not_supported_functions :
294305 rendered_not_supported = self .render_not_supported_functions (not_supported_functions )
@@ -329,7 +340,23 @@ def _generate_from_raw_query_container(self, query_container: RawQueryContainer)
329340 prefix = "" , query = query_container .query , functions = "" , meta_info = query_container .meta_info
330341 )
331342
343+ def process_raw_log_field (self , field : str , field_type : str ) -> Optional [str ]:
344+ if raw_log_field_pattern := self .raw_log_field_pattern_map .get (field_type ):
345+ return raw_log_field_pattern .pattern .format (field = field )
346+
347+ def process_raw_log_field_prefix (self , field : str , source_mapping : SourceMapping ) -> Optional [list ]:
348+ if isinstance (field , list ):
349+ list_of_prefix = []
350+ for f in field :
351+ if prepared_prefix := self .process_raw_log_field_prefix (field = f , source_mapping = source_mapping ):
352+ list_of_prefix .extend (prepared_prefix )
353+ return list_of_prefix
354+ if raw_log_field_type := source_mapping .raw_log_fields .get (field ):
355+ return [self .process_raw_log_field (field = field , field_type = raw_log_field_type )]
356+
332357 def generate_raw_log_fields (self , fields : list [Field ], source_mapping : SourceMapping ) -> str :
358+ if self .raw_log_field_pattern_map is None :
359+ return ""
333360 defined_raw_log_fields = []
334361 for field in fields :
335362 mapped_field = source_mapping .fields_mapping .get_platform_field_name (generic_field_name = field .source_name )
@@ -340,10 +367,8 @@ def generate_raw_log_fields(self, fields: list[Field], source_mapping: SourceMap
340367 )
341368 if not mapped_field and self .is_strict_mapping :
342369 raise StrictPlatformException (field_name = field .source_name , platform_name = self .details .name )
343- if mapped_field not in source_mapping .raw_log_fields :
344- continue
345- field_prefix = self .raw_log_field_pattern .format (field = mapped_field )
346- defined_raw_log_fields .append (field_prefix )
370+ if field_prefix := self .process_raw_log_field_prefix (field = mapped_field , source_mapping = source_mapping ):
371+ defined_raw_log_fields .extend (field_prefix )
347372 return "\n " .join (set (defined_raw_log_fields ))
348373
349374 def _generate_from_tokenized_query_container (self , query_container : TokenizedQueryContainer ) -> str :
@@ -374,6 +399,8 @@ def _generate_from_tokenized_query_container(self, query_container: TokenizedQue
374399 meta_info = query_container .meta_info ,
375400 source_mapping = source_mapping ,
376401 )
402+ if return_only_first_query_ctx_var .get () is True :
403+ return finalized_query
377404 queries_map [source_mapping .source_id ] = finalized_query
378405 if not queries_map and errors :
379406 raise errors [0 ]
0 commit comments