Skip to content

Commit 69f8f6c

Browse files
author
oleksandr.volha
committed
spl str value manager
1 parent 883374f commit 69f8f6c

File tree

5 files changed

+86
-21
lines changed

5 files changed

+86
-21
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@
66

77

88
class SplEscapeManager(EscapeManager):
9-
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {
10-
ValueType.value: [EscapeDetails(pattern='("|(?<!\\\\)\\\\(?![*?\\\\]))')]
11-
}
9+
escape_map: ClassVar[dict[str, list[EscapeDetails]]] = {ValueType.value: [EscapeDetails(pattern=r"([<>=\"'\|\\])")]}
1210

1311

1412
spl_escape_manager = SplEscapeManager()

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

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,55 +20,67 @@
2020
from typing import Union
2121

2222
from app.translator.const import DEFAULT_VALUE_TYPE
23+
from app.translator.core.custom_types.values import ValueType
2324
from app.translator.core.exceptions.render import UnsupportedRenderMethod
2425
from app.translator.core.render import BaseFieldValueRender, PlatformQueryRender
25-
from app.translator.platforms.base.spl.escape_manager import spl_escape_manager
26+
from app.translator.core.str_value_manager import StrValue
27+
from app.translator.platforms.base.spl.str_value_manager import spl_str_value_manager
2628

2729

2830
class SplFieldValueRender(BaseFieldValueRender):
29-
escape_manager = spl_escape_manager
31+
str_value_manager = spl_str_value_manager
32+
33+
@staticmethod
34+
def _wrap_str_value(value: str) -> str:
35+
return f'"{value}"'
36+
37+
def _pre_process_value(
38+
self, field: str, value: Union[int, str, StrValue], value_type: str = ValueType.value, wrap_str: bool = False
39+
) -> Union[int, str]:
40+
value = super()._pre_process_value(field, value, value_type=value_type, wrap_str=wrap_str)
41+
return self._wrap_str_value(str(value)) if not isinstance(value, str) else value
3042

3143
def equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
3244
if isinstance(value, list):
3345
return f"({self.or_token.join([self.equal_modifier(field=field, value=v) for v in value])})"
34-
return f'{field}="{self.apply_value(value)}"'
46+
return f"{field}={self._pre_process_value(field, value, wrap_str=True)}"
3547

3648
def less_modifier(self, field: str, value: Union[int, str]) -> str:
37-
return f'{field}<"{self.apply_value(value)}"'
49+
return f"{field}<{self._pre_process_value(field, value, wrap_str=True)}"
3850

3951
def less_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
40-
return f'{field}<="{self.apply_value(value)}"'
52+
return f"{field}<={self._pre_process_value(field, value, wrap_str=True)}"
4153

4254
def greater_modifier(self, field: str, value: Union[int, str]) -> str:
43-
return f'{field}>"{self.apply_value(value)}"'
55+
return f"{field}>{self._pre_process_value(field, value, wrap_str=True)}"
4456

4557
def greater_or_equal_modifier(self, field: str, value: Union[int, str]) -> str:
46-
return f'{field}>="{self.apply_value(value)}"'
58+
return f"{field}>={self._pre_process_value(field, value, wrap_str=True)}"
4759

4860
def not_equal_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
4961
if isinstance(value, list):
5062
return f"({self.or_token.join([self.not_equal_modifier(field=field, value=v) for v in value])})"
51-
return f'{field}!="{self.apply_value(value)}"'
63+
return f"{field}!={self._pre_process_value(field, value, wrap_str=True)}"
5264

5365
def contains_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
5466
if isinstance(value, list):
5567
return f"({self.or_token.join([self.contains_modifier(field=field, value=v) for v in value])})"
56-
return f'{field}="*{self.apply_value(value)}*"'
68+
return f'{field}="*{self._pre_process_value(field, value)}*"'
5769

5870
def endswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
5971
if isinstance(value, list):
6072
return f"({self.or_token.join([self.endswith_modifier(field=field, value=v) for v in value])})"
61-
return f'{field}="*{self.apply_value(value)}"'
73+
return f'{field}="*{self._pre_process_value(field, value)}"'
6274

6375
def startswith_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6476
if isinstance(value, list):
6577
return f"({self.or_token.join([self.startswith_modifier(field=field, value=v) for v in value])})"
66-
return f'{field}="{self.apply_value(value)}*"'
78+
return f'{field}="{self._pre_process_value(field, value)}*"'
6779

6880
def keywords(self, field: str, value: DEFAULT_VALUE_TYPE) -> str:
6981
if isinstance(value, list):
7082
return f"({self.or_token.join(self.keywords(field=field, value=v) for v in value)})"
71-
return f'"{self.apply_value(value)}"'
83+
return f"{self._pre_process_value(field, value, wrap_str=True)}"
7284

7385
def regex_modifier(self, field: str, value: DEFAULT_VALUE_TYPE) -> str: # noqa: ARG002
7486
raise UnsupportedRenderMethod(platform_name=self.details.name, method="Regex Expression")
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
"""
2+
Uncoder IO Community Edition License
3+
-----------------------------------------------------------------
4+
Copyright (c) 2023 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 ClassVar
20+
21+
from app.translator.core.str_value_manager import BaseSpecSymbol, StrValue, StrValueManager, UnboundLenWildCard
22+
from app.translator.platforms.base.spl.escape_manager import spl_escape_manager
23+
24+
25+
class SplStrValueManager(StrValueManager):
26+
escape_manager = spl_escape_manager
27+
str_spec_symbols_map: ClassVar[dict[str, type[BaseSpecSymbol]]] = {"*": UnboundLenWildCard}
28+
29+
def from_str_to_container(self, value: str) -> StrValue:
30+
split = []
31+
prev_char = None
32+
for char in value:
33+
if char == "\\":
34+
if prev_char == "\\":
35+
split.append("\\")
36+
prev_char = None
37+
continue
38+
elif char in self.str_spec_symbols_map:
39+
if prev_char == "\\":
40+
split.append(char)
41+
else:
42+
split.append(self.str_spec_symbols_map[char]())
43+
elif char in ('"', "=", "|", "<", ">"):
44+
split.append(char)
45+
else:
46+
if prev_char == "\\":
47+
split.append(prev_char)
48+
split.append(char)
49+
50+
prev_char = char
51+
52+
return StrValue(self.escape_manager.remove_escape(value), self._concat(split))
53+
54+
55+
spl_str_value_manager = SplStrValueManager()

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from app.translator.platforms.base.spl.const import NO_QUOTES_VALUES_PATTERN as NO_Q_V_PATTERN
3030
from app.translator.platforms.base.spl.const import NUM_VALUE_PATTERN as N_V_PATTERN
3131
from app.translator.platforms.base.spl.const import SINGLE_QUOTES_VALUE_PATTERN as S_Q_V_PATTERN
32-
from app.translator.platforms.base.spl.escape_manager import spl_escape_manager
32+
from app.translator.platforms.base.spl.str_value_manager import spl_str_value_manager
3333
from app.translator.tools.utils import get_match_group
3434

3535

@@ -57,7 +57,7 @@ class SplTokenizer(QueryTokenizer, ANDLogicOperatorMixin):
5757

5858
wildcard_symbol = "*"
5959

60-
escape_manager = spl_escape_manager
60+
str_value_manager = spl_str_value_manager
6161

6262
def get_operator_and_value(
6363
self, match: re.Match, mapped_operator: str = OperatorType.EQ, operator: Optional[str] = None
@@ -66,13 +66,13 @@ def get_operator_and_value(
6666
return mapped_operator, num_value
6767

6868
if (no_q_value := get_match_group(match, group_name=ValueType.no_quotes_value)) is not None:
69-
return mapped_operator, no_q_value
69+
return mapped_operator, self.str_value_manager.from_str_to_container(no_q_value)
7070

7171
if (d_q_value := get_match_group(match, group_name=ValueType.double_quotes_value)) is not None:
72-
return mapped_operator, self.escape_manager.remove_escape(d_q_value)
72+
return mapped_operator, self.str_value_manager.from_str_to_container(d_q_value)
7373

7474
if (s_q_value := get_match_group(match, group_name=ValueType.single_quotes_value)) is not None:
75-
return mapped_operator, self.escape_manager.remove_escape(s_q_value)
75+
return mapped_operator, self.str_value_manager.from_str_to_container(s_q_value)
7676

7777
return super().get_operator_and_value(match, mapped_operator, operator)
7878

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def get_operator_and_value(
5757
return mapped_operator, num_value
5858

5959
if (d_q_value := get_match_group(match, group_name=ValueType.double_quotes_value)) is not None:
60-
return mapped_operator, d_q_value
60+
return mapped_operator, self.escape_manager.remove_escape(d_q_value)
6161

6262
if (re_value := get_match_group(match, group_name=ValueType.regex_value)) is not None:
6363
return OperatorType.REGEX, re_value

0 commit comments

Comments
 (0)