Skip to content

Commit 1c1333f

Browse files
committed
gis-8639 fix
1 parent 90f2179 commit 1c1333f

File tree

1 file changed

+139
-0
lines changed
  • uncoder-core/app/translator/platforms/elasticsearch/renders

1 file changed

+139
-0
lines changed
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
"""
2+
Uncoder IO Community Edition License
3+
-----------------------------------------------------------------
4+
Copyright (c) 2024 SOC Prime, Inc.
5+
6+
Licensed under the Apache License, Version 2.0 (the "License");
7+
you may not use this file except in compliance with the License.
8+
You may obtain a copy of the License at
9+
10+
http://www.apache.org/licenses/LICENSE-2.0
11+
12+
Unless required by applicable law or agreed to in writing, software
13+
distributed under the License is distributed on an "AS IS" BASIS,
14+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
See the License for the specific language governing permissions and
16+
limitations under the License.
17+
-----------------------------------------------------------------
18+
"""
19+
from typing import Optional, Union
20+
21+
from app.translator.const import DEFAULT_VALUE_TYPE
22+
from app.translator.core.custom_types.values import ValueType
23+
from app.translator.core.exceptions.render import UnsupportedRenderMethod
24+
from app.translator.core.mapping import LogSourceSignature
25+
from app.translator.core.models.platform_details import PlatformDetails
26+
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
27+
from app.translator.managers import render_manager
28+
from app.translator.platforms.elasticsearch.const import elasticsearch_esql_query_details
29+
from app.translator.platforms.elasticsearch.mapping import ElasticESQLMappings, esql_query_mappings
30+
from app.translator.platforms.elasticsearch.str_value_manager import (
31+
ESQLStrValueManager,
32+
esql_str_value_manager,
33+
)
34+
35+
36+
class ESQLFieldValueRender(BaseFieldValueRender):
37+
details: PlatformDetails = elasticsearch_esql_query_details
38+
str_value_manager: ESQLStrValueManager = esql_str_value_manager
39+
40+
@staticmethod
41+
def _make_case_insensitive(value: str) -> str:
42+
container: list[str] = []
43+
for v in value:
44+
if v.isalpha():
45+
container.append(f"[{v.upper()}{v.lower()}]")
46+
else:
47+
container.append(v)
48+
return "".join(container)
49+
50+
@staticmethod
51+
def _wrap_str_value(value: str) -> str:
52+
return f'"{value}"'
53+
54+
@staticmethod
55+
def _wrap_int_value(value: int) -> str:
56+
return f'"{value}"'
57+
58+
def equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
59+
if isinstance(value, list):
60+
return f"({self.or_token.join([self.equal_modifier(field=field, value=v) for v in value])})"
61+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
62+
return f"{field} == {value}"
63+
64+
def less_modifier(self, field: str, value: Union[int, str]) -> str:
65+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
66+
return f"{field} < {value}"
67+
68+
def less_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
69+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
70+
return f"{field} <= {value}"
71+
72+
def greater_modifier(self, field: str, value: Union[int, str]) -> str:
73+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
74+
return f"{field} > {value}"
75+
76+
def greater_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
77+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
78+
return f"{field} >= {value}"
79+
80+
def not_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
81+
if isinstance(value, list):
82+
return f"({self.or_token.join([self.not_equal_modifier(field=field, value=v) for v in value])})"
83+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
84+
return f"{field} != {value}"
85+
86+
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
87+
if isinstance(value, list):
88+
return f"({self.or_token.join(self.contains_modifier(field=field, value=v) for v in value)})"
89+
if field.endswith(".text"):
90+
return self.regex_modifier(field=field, value=value)
91+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=False, wrap_int=True)
92+
return f'{field} like "*{value}*"'
93+
94+
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
95+
if field.endswith(".text"):
96+
return self.regex_modifier(field=field, value=value)
97+
if isinstance(value, list):
98+
return f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
99+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
100+
return f"ends_with({field}, {value})"
101+
102+
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
103+
if field.endswith(".text"):
104+
return self.regex_modifier(field=field, value=value)
105+
if isinstance(value, list):
106+
return f"({self.or_token.join(self.startswith_modifier(field=field, value=v) for v in value)})"
107+
value = self._pre_process_value(field, value, value_type=ValueType.value, wrap_str=True, wrap_int=True)
108+
return f"starts_with({field}, {value})"
109+
110+
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
111+
if isinstance(value, list):
112+
return f"({self.or_token.join(self.regex_modifier(field=field, value=v) for v in value)})"
113+
value = self._pre_process_value(field, value, value_type=ValueType.regex_value, wrap_str=False, wrap_int=True)
114+
if isinstance(value, str):
115+
value = self._make_case_insensitive(value)
116+
return f'{field} rlike ".*{value}.*"'
117+
118+
def keywords(self, field: str, value: DEFAULT_VALUE_TYPE) -> str: # noqa: ARG002
119+
raise UnsupportedRenderMethod(platform_name=self.details.name, method="Keywords")
120+
121+
122+
@render_manager.register
123+
class ESQLQueryRender(PlatformQueryRender):
124+
details: PlatformDetails = elasticsearch_esql_query_details
125+
mappings: ElasticESQLMappings = esql_query_mappings
126+
comment_symbol = "//"
127+
128+
or_token = "or"
129+
and_token = "and"
130+
not_token = "not"
131+
field_value_render = ESQLFieldValueRender(or_token=or_token)
132+
133+
def generate_prefix(self, log_source_signature: Optional[LogSourceSignature], functions_prefix: str = "") -> str: # noqa: ARG002
134+
table = str(log_source_signature) if str(log_source_signature) else "*"
135+
return f"FROM {table} |"
136+
137+
@staticmethod
138+
def _finalize_search_query(query: str) -> str:
139+
return f"WHERE {query}" if query else ""

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy