1616limitations under the License.
1717-----------------------------------------------------------------
1818"""
19+
1920from abc import ABC , abstractmethod
2021from collections .abc import Callable
2122from typing import ClassVar , Optional , Union
@@ -196,10 +197,10 @@ class PlatformQueryRender(QueryRender):
196197 not_token = "not"
197198
198199 group_token = "(%s)"
200+ query_parts_delimiter = " "
199201
200202 field_value_map = BaseQueryFieldValue (or_token = or_token )
201203
202- query_pattern = "{table} {query} {functions}"
203204 raw_log_field_pattern_map : ClassVar [dict [str , str ]] = None
204205
205206 def __init__ (self ):
@@ -210,9 +211,9 @@ def __init__(self):
210211 LogicalOperatorType .NOT : f" { self .not_token } " ,
211212 }
212213
213- def generate_prefix (self , log_source_signature : LogSourceSignature , functions_prefix : str = "" ) -> str : # noqa: ARG002
214- if str (log_source_signature ):
215- return f"{ log_source_signature !s } { self .and_token } "
214+ def generate_prefix (self , log_source_signature : Optional [ LogSourceSignature ] , functions_prefix : str = "" ) -> str : # noqa: ARG002
215+ if log_source_signature and str (log_source_signature ):
216+ return f"{ log_source_signature } { self .and_token } "
216217 return ""
217218
218219 def generate_functions (self , functions : list [Function ], source_mapping : SourceMapping ) -> RenderedFunctions :
@@ -262,8 +263,14 @@ def apply_token(self, token: Union[FieldValue, Keyword, Identifier], source_mapp
262263
263264 def generate_query (self , tokens : list [TOKEN_TYPE ], source_mapping : SourceMapping ) -> str :
264265 result_values = []
266+ unmapped_fields = set ()
265267 for token in tokens :
266- result_values .append (self .apply_token (token = token , source_mapping = source_mapping ))
268+ try :
269+ result_values .append (self .apply_token (token = token , source_mapping = source_mapping ))
270+ except StrictPlatformException as err :
271+ unmapped_fields .add (err .field_name )
272+ if unmapped_fields :
273+ raise StrictPlatformException (self .details .name , "" , source_mapping .source_id , sorted (unmapped_fields ))
267274 return "" .join (result_values )
268275
269276 def wrap_query_with_meta_info (self , meta_info : MetaInfoContainer , query : str ) -> str :
@@ -280,6 +287,14 @@ def wrap_query_with_meta_info(self, meta_info: MetaInfoContainer, query: str) ->
280287 query = f"{ query } \n \n { query_meta_info } "
281288 return query
282289
290+ @staticmethod
291+ def _finalize_search_query (query : str ) -> str :
292+ return query
293+
294+ def _join_query_parts (self , prefix : str , query : str , functions : str ) -> str :
295+ parts = filter (lambda s : bool (s ), map (str .strip , [prefix , self ._finalize_search_query (query ), functions ]))
296+ return self .query_parts_delimiter .join (parts )
297+
283298 def finalize_query (
284299 self ,
285300 prefix : str ,
@@ -291,8 +306,7 @@ def finalize_query(
291306 * args , # noqa: ARG002
292307 ** kwargs , # noqa: ARG002
293308 ) -> str :
294- query = self .query_pattern .format (prefix = prefix , query = query , functions = functions ).strip ()
295-
309+ query = self ._join_query_parts (prefix , query , functions )
296310 query = self .wrap_query_with_meta_info (meta_info = meta_info , query = query )
297311 if not_supported_functions :
298312 rendered_not_supported = self .render_not_supported_functions (not_supported_functions )
@@ -335,15 +349,15 @@ def _generate_from_raw_query_container(self, query_container: RawQueryContainer)
335349
336350 def process_raw_log_field (self , field : str , field_type : str ) -> Optional [str ]:
337351 if raw_log_field_pattern := self .raw_log_field_pattern_map .get (field_type ):
338- return raw_log_field_pattern .pattern . format (field = field )
352+ return raw_log_field_pattern .format (field = field )
339353
340354 def process_raw_log_field_prefix (self , field : str , source_mapping : SourceMapping ) -> Optional [list ]:
341355 if isinstance (field , list ):
342- list_of_prefix = []
356+ prefix_list = []
343357 for f in field :
344- if prepared_prefix := self .process_raw_log_field_prefix (field = f , source_mapping = source_mapping ):
345- list_of_prefix .extend (prepared_prefix )
346- return list_of_prefix
358+ if _prefix_list := self .process_raw_log_field_prefix (field = f , source_mapping = source_mapping ):
359+ prefix_list .extend (_prefix_list )
360+ return prefix_list
347361 if raw_log_field_type := source_mapping .raw_log_fields .get (field ):
348362 return [self .process_raw_log_field (field = field , field_type = raw_log_field_type )]
349363
@@ -360,9 +374,11 @@ def generate_raw_log_fields(self, fields: list[Field], source_mapping: SourceMap
360374 )
361375 if not mapped_field and self .is_strict_mapping :
362376 raise StrictPlatformException (field_name = field .source_name , platform_name = self .details .name )
363- if field_prefix := self .process_raw_log_field_prefix (field = mapped_field , source_mapping = source_mapping ):
364- defined_raw_log_fields .extend (field_prefix )
365- return "\n " .join (set (defined_raw_log_fields ))
377+ if prefix_list := self .process_raw_log_field_prefix (field = mapped_field , source_mapping = source_mapping ):
378+ for prefix in prefix_list :
379+ if prefix not in defined_raw_log_fields :
380+ defined_raw_log_fields .append (prefix )
381+ return "\n " .join (defined_raw_log_fields )
366382
367383 def _generate_from_tokenized_query_container (self , query_container : TokenizedQueryContainer ) -> str :
368384 queries_map = {}
@@ -377,7 +393,7 @@ def _generate_from_tokenized_query_container(self, query_container: TokenizedQue
377393 defined_raw_log_fields = self .generate_raw_log_fields (
378394 fields = query_container .meta_info .query_fields , source_mapping = source_mapping
379395 )
380- prefix += f"\n { defined_raw_log_fields } \n "
396+ prefix += f"\n { defined_raw_log_fields } "
381397 result = self .generate_query (tokens = query_container .tokens , source_mapping = source_mapping )
382398 except StrictPlatformException as err :
383399 errors .append (err )
0 commit comments