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)
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