Skip to content

Commit 3e2c071

Browse files
authored
Merge pull request #206 from UncoderIO/gis-7011
sql str value manager
2 parents 416f5ca + ebc3e81 commit 3e2c071

File tree

18 files changed

+177
-101
lines changed

18 files changed

+177
-101
lines changed

uncoder-core/app/translator/core/str_value_manager.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,11 @@ class StrValueManager:
182182
container_spec_symbols_map: ClassVar[dict[type[BaseSpecSymbol], str]] = CONTAINER_SPEC_SYMBOLS_MAP
183183

184184
@staticmethod
185-
def from_str_to_container(value: str) -> StrValue:
185+
def from_str_to_container(
186+
value: str,
187+
value_type: str = ValueType.value, # noqa: ARG004
188+
escape_symbol: Optional[str] = None, # noqa: ARG004
189+
) -> StrValue:
186190
return StrValue(value=value, split_value=[value])
187191

188192
def from_re_str_to_container(self, value: str) -> StrValue:

uncoder-core/app/translator/core/tokenizer.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,7 @@ def search_multi_value(
162162

163163
def _get_field_value_match(self, query: str, operator: str, field_name: str, value_pattern: str) -> re.Match:
164164
field_value_pattern = self.get_field_value_pattern(operator, field_name, value_pattern)
165-
field_value_regex = re.compile(field_value_pattern, re.IGNORECASE)
166-
field_value_match = re.match(field_value_regex, query)
165+
field_value_match = re.match(field_value_pattern, query, re.IGNORECASE)
167166
if field_value_match is None:
168167
raise TokenizerGeneralException(error=f"Value couldn't be found in query part: {query}")
169168

uncoder-core/app/translator/platforms/anomali/renders/anomali.py

Lines changed: 11 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -17,65 +17,37 @@
1717
-----------------------------------------------------------------
1818
"""
1919
from app.translator.const import DEFAULT_VALUE_TYPE
20-
from app.translator.core.custom_types.values import ValueType
2120
from app.translator.core.models.platform_details import PlatformDetails
22-
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
21+
from app.translator.core.render import PlatformQueryRender
2322
from app.translator.managers import render_manager
2423
from app.translator.platforms.anomali.const import anomali_query_details
2524
from app.translator.platforms.anomali.mapping import AnomaliMappings, anomali_query_mappings
26-
from app.translator.platforms.base.sql.str_value_manager import sql_str_value_manager
25+
from app.translator.platforms.base.sql.renders.sql import SqlFieldValueRender
2726

2827

29-
class AnomaliFieldValueRender(BaseFieldValueRender):
28+
class AnomaliFieldValueRender(SqlFieldValueRender):
3029
details: PlatformDetails = anomali_query_details
31-
str_value_manager = sql_str_value_manager
32-
33-
@staticmethod
34-
def _wrap_str_value(value: str) -> str:
35-
return f"'{value}'"
36-
37-
def equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
38-
if isinstance(value, list):
39-
return f"({self.or_token.join([self.equal_modifier(field=field, value=v) for v in value])})"
40-
return f"{field} = {self._pre_process_value(field, value, wrap_str=True)}"
41-
42-
def not_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
43-
if isinstance(value, list):
44-
return f"({self.or_token.join([self.not_equal_modifier(field=field, value=v) for v in value])})"
45-
return f"{field} != {self._pre_process_value(field, value, wrap_str=True)}"
46-
47-
def less_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
48-
return f"{field} < {self._pre_process_value(field, value, wrap_str=True)}"
49-
50-
def less_or_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
51-
return f"{field} <= {self._pre_process_value(field, value, wrap_str=True)}"
52-
53-
def greater_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
54-
return f"{field} > {self._pre_process_value(field, value, wrap_str=True)}"
55-
56-
def greater_or_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
57-
return f"{field} >= {self._pre_process_value(field, value, wrap_str=True)}"
5830

5931
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6032
if isinstance(value, list):
6133
return f"({self.or_token.join(self.contains_modifier(field=field, value=v) for v in value)})"
62-
return f"{field} like '%{self._pre_process_value(field, value)}%'"
34+
35+
value = f"'%{self._pre_process_value(field, value)}%'"
36+
return f"{field} like {value}"
6337

6438
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6539
if isinstance(value, list):
6640
return f"({self.or_token.join(self.endswith_modifier(field=field, value=v) for v in value)})"
67-
return f"{field} like '%{self._pre_process_value(field, value)}'"
41+
42+
value = f"'%{self._pre_process_value(field, value)}'"
43+
return f"{field} like {value}"
6844

6945
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
7046
if isinstance(value, list):
7147
return f"({self.or_token.join(self.startswith_modifier(field=field, value=v) for v in value)})"
72-
return f"{field} like '{self._pre_process_value(field, value)}%'"
7348

74-
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
75-
if isinstance(value, list):
76-
return f"({self.or_token.join(self.regex_modifier(field=field, value=v) for v in value)})"
77-
regex_str = self._pre_process_value(field, value, value_type=ValueType.regex_value, wrap_str=True)
78-
return f"regexp_like({field}, {regex_str})"
49+
value = f"'{self._pre_process_value(field, value)}%'"
50+
return f"{field} like {value}"
7951

8052
def keywords(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
8153
return f'message contains "{self._pre_process_value(field, value)}"'

uncoder-core/app/translator/platforms/base/aql/str_value_manager.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"""
1919

2020
import copy
21-
from typing import ClassVar
21+
from typing import ClassVar, Optional
2222

2323
from app.translator.core.custom_types.values import ValueType
2424
from app.translator.core.str_value_manager import (
@@ -55,7 +55,12 @@ class AQLStrValueManager(StrValueManager):
5555
"%": UnboundLenWildCard,
5656
}
5757

58-
def from_str_to_container(self, value: str) -> StrValue:
58+
def from_str_to_container(
59+
self,
60+
value: str,
61+
value_type: str = ValueType.value, # noqa: ARG002
62+
escape_symbol: Optional[str] = None, # noqa: ARG002
63+
) -> StrValue:
5964
split = []
6065
prev_char = None
6166
for char in value:

uncoder-core/app/translator/platforms/base/lucene/str_value_manager.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@
1717
-----------------------------------------------------------------
1818
"""
1919

20-
from typing import ClassVar
20+
from typing import ClassVar, Optional
2121

22+
from app.translator.core.custom_types.values import ValueType
2223
from app.translator.core.str_value_manager import (
2324
BaseSpecSymbol,
2425
ReAnySymbol,
@@ -68,7 +69,12 @@ class LuceneStrValueManager(StrValueManager):
6869
}
6970
re_str_spec_symbols_map = RE_STR_SPEC_SYMBOLS_MAP
7071

71-
def from_str_to_container(self, value: str) -> StrValue:
72+
def from_str_to_container(
73+
self,
74+
value: str,
75+
value_type: str = ValueType.value, # noqa: ARG002
76+
escape_symbol: Optional[str] = None, # noqa: ARG002
77+
) -> StrValue:
7278
split = []
7379
prev_char = None
7480
for char in value:

uncoder-core/app/translator/platforms/base/spl/renders/spl.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,12 @@ def _wrap_str_value(value: str) -> str:
3434
return f'"{value}"'
3535

3636
def _pre_process_value(
37-
self, field: str, value: Union[int, str, StrValue], value_type: str = ValueType.value, wrap_str: bool = False
37+
self,
38+
field: str,
39+
value: Union[bool, int, str, StrValue],
40+
value_type: str = ValueType.value,
41+
wrap_str: bool = False,
42+
wrap_int: bool = False, # noqa: ARG002
3843
) -> Union[int, str]:
3944
value = super()._pre_process_value(field, value, value_type=value_type, wrap_str=wrap_str)
4045
return self._wrap_str_value(str(value)) if not isinstance(value, str) else value

uncoder-core/app/translator/platforms/base/spl/str_value_manager.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@
1616
limitations under the License.
1717
-----------------------------------------------------------------
1818
"""
19-
from typing import ClassVar
19+
from typing import ClassVar, Optional
2020

21+
from app.translator.core.custom_types.values import ValueType
2122
from app.translator.core.str_value_manager import BaseSpecSymbol, StrValue, StrValueManager, UnboundLenWildCard
2223
from app.translator.platforms.base.spl.escape_manager import spl_escape_manager
2324

@@ -26,7 +27,12 @@ class SplStrValueManager(StrValueManager):
2627
escape_manager = spl_escape_manager
2728
str_spec_symbols_map: ClassVar[dict[str, type[BaseSpecSymbol]]] = {"*": UnboundLenWildCard}
2829

29-
def from_str_to_container(self, value: str) -> StrValue:
30+
def from_str_to_container(
31+
self,
32+
value: str,
33+
value_type: str = ValueType.value, # noqa: ARG002
34+
escape_symbol: Optional[str] = None, # noqa: ARG002
35+
) -> StrValue:
3036
split = []
3137
prev_char = None
3238
for char in value:

uncoder-core/app/translator/platforms/base/sql/custom_types/__init__.py

Whitespace-only changes.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
from app.translator.core.custom_types.values import ValueType
2+
3+
4+
class SQLValueType(ValueType):
5+
like_value = "like_value"

uncoder-core/app/translator/platforms/base/sql/escape_manager.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from typing import ClassVar
22

3-
from app.translator.core.custom_types.values import ValueType
43
from app.translator.core.escape_manager import EscapeManager
54
from app.translator.core.models.escape_details import EscapeDetails
5+
from app.translator.platforms.base.sql.custom_types.values import SQLValueType
66

77

88
class SQLEscapeManager(EscapeManager):
99
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {
10-
ValueType.value: [EscapeDetails(pattern=r"(')", escape_symbols=r"'\1")],
11-
ValueType.regex_value: [
10+
SQLValueType.value: [EscapeDetails(pattern=r"(')", escape_symbols=r"'\1")],
11+
SQLValueType.like_value: [EscapeDetails(pattern=r"(['%_\\])", escape_symbols=r"\\\1")],
12+
SQLValueType.regex_value: [
1213
EscapeDetails(pattern=r"([$^*+()\[\]{}|.?\-\\])", escape_symbols=r"\\\1"),
1314
EscapeDetails(pattern=r"(')", escape_symbols=r"'\1"),
1415
],

0 commit comments

Comments
 (0)