Skip to content

Commit 35e8154

Browse files
committed
merge main
2 parents ed5fc95 + 94e16aa commit 35e8154

File tree

20 files changed

+174
-63
lines changed

20 files changed

+174
-63
lines changed

uncoder-core/app/translator/core/custom_types/functions.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,21 @@ class FunctionType(CustomEnum):
1515
latest = "latest"
1616

1717
divide = "divide"
18+
multiply = "multiply"
1819

1920
lower = "lower"
2021
split = "split"
2122
upper = "upper"
2223

2324
array_length = "array_length"
24-
compare = "compare"
2525
extract_time = "extract_time"
2626
ipv4_is_in_range = "ipv4_is_in_range"
2727

2828
bin = "bin"
2929
eval = "eval"
3030
fields = "fields"
31+
iploc = "iploc"
32+
join = "join"
3133
rename = "rename"
3234
search = "search"
3335
sort_limit = "sort_limit"

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

Lines changed: 11 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626
from app.translator.core.exceptions.functions import NotSupportedFunctionException
2727
from app.translator.core.mapping import SourceMapping
28-
from app.translator.core.models.field import Alias, Field
2928
from app.translator.core.models.functions.base import Function, ParsedFunctions, RenderedFunctions
29+
from app.translator.core.models.query_tokens.field import Alias, Field, PredefinedField
3030
from app.translator.tools.utils import execute_module
3131
from settings import INIT_FUNCTIONS
3232

@@ -83,7 +83,6 @@ def parse(self, func_body: str, raw: str) -> Function:
8383
class FunctionRender(ABC):
8484
function_names_map: ClassVar[dict[str, str]] = {}
8585
order_to_render: int = 0
86-
in_query_render: bool = False
8786
render_to_prefix: bool = False
8887
manager: PlatformFunctionsManager = None
8988

@@ -95,17 +94,19 @@ def set_functions_manager(self, manager: PlatformFunctionsManager) -> FunctionRe
9594
def render(self, function: Function, source_mapping: SourceMapping) -> str:
9695
raise NotImplementedError
9796

98-
@staticmethod
99-
def map_field(field: Union[Alias, Field], source_mapping: SourceMapping) -> str:
97+
def map_field(self, field: Union[Alias, Field], source_mapping: SourceMapping) -> str:
10098
if isinstance(field, Alias):
10199
return field.name
102100

103-
generic_field_name = field.get_generic_field_name(source_mapping.source_id)
104-
mapped_field = source_mapping.fields_mapping.get_platform_field_name(generic_field_name=generic_field_name)
105-
if isinstance(mapped_field, list):
106-
mapped_field = mapped_field[0]
101+
if isinstance(field, Field):
102+
mappings = self.manager.platform_functions.platform_query_render.mappings
103+
mapped_fields = mappings.map_field(field, source_mapping)
104+
return mapped_fields[0]
107105

108-
return mapped_field if mapped_field else field.source_name
106+
if isinstance(field, PredefinedField):
107+
return self.manager.platform_functions.platform_query_render.map_predefined_field(field)
108+
109+
raise NotSupportedFunctionException
109110

110111

111112
class PlatformFunctionsManager:
@@ -117,7 +118,6 @@ def __init__(self):
117118
self._parsers_map: dict[str, FunctionParser] = {} # {platform_func_name: FunctionParser}
118119

119120
self._renders_map: dict[str, FunctionRender] = {} # {generic_func_name: FunctionRender}
120-
self._in_query_renders_map: dict[str, FunctionRender] = {} # {generic_func_name: FunctionRender}
121121
self._order_to_render: dict[str, int] = {} # {generic_func_name: int}
122122

123123
def register_render(self, render_class: type[FunctionRender]) -> type[FunctionRender]:
@@ -126,8 +126,6 @@ def register_render(self, render_class: type[FunctionRender]) -> type[FunctionRe
126126
for generic_function_name in render.function_names_map:
127127
self._renders_map[generic_function_name] = render
128128
self._order_to_render[generic_function_name] = render.order_to_render
129-
if render.in_query_render:
130-
self._in_query_renders_map[generic_function_name] = render
131129

132130
return render_class
133131

@@ -149,24 +147,16 @@ def get_hof_parser(self, platform_func_name: str) -> HigherOrderFunctionParser:
149147

150148
raise NotSupportedFunctionException
151149

152-
def get_parser(self, platform_func_name: str) -> FunctionParser:
150+
def get_parser(self, platform_func_name: str) -> Optional[FunctionParser]:
153151
if INIT_FUNCTIONS and (parser := self._parsers_map.get(platform_func_name)):
154152
return parser
155153

156-
raise NotSupportedFunctionException
157-
158154
def get_render(self, generic_func_name: str) -> FunctionRender:
159155
if INIT_FUNCTIONS and (render := self._renders_map.get(generic_func_name)):
160156
return render
161157

162158
raise NotSupportedFunctionException
163159

164-
def get_in_query_render(self, generic_func_name: str) -> FunctionRender:
165-
if INIT_FUNCTIONS and (render := self._in_query_renders_map.get(generic_func_name)):
166-
return render
167-
168-
raise NotSupportedFunctionException
169-
170160
@property
171161
def order_to_render(self) -> dict[str, int]:
172162
if INIT_FUNCTIONS:

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from abc import ABC, abstractmethod
4-
from typing import TYPE_CHECKING, Optional, TypeVar, Union
4+
from typing import TYPE_CHECKING, Optional, TypeVar
55

66
from app.translator.core.exceptions.core import StrictPlatformException
77
from app.translator.core.models.platform_details import PlatformDetails

uncoder-core/app/translator/core/models/functions/base.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,38 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass, field
4-
from typing import Optional, Union
4+
from typing import TYPE_CHECKING, Optional, Union
55

6-
from app.translator.core.models.field import Alias, Field, FieldValue, Keyword
7-
from app.translator.core.models.identifier import Identifier
6+
from app.translator.core.models.query_tokens.field import Alias, BaseFieldsGetter, Field
7+
from app.translator.core.models.query_tokens.field_field import FieldField
8+
from app.translator.core.models.query_tokens.field_value import FieldValue
9+
from app.translator.core.models.query_tokens.identifier import Identifier
10+
from app.translator.core.models.query_tokens.keyword import Keyword
11+
12+
if TYPE_CHECKING:
13+
from app.translator.core.models.query_tokens.function_value import FunctionValue
814

915

1016
@dataclass
11-
class Function:
17+
class Function(BaseFieldsGetter):
1218
name: str = None
13-
args: list[Union[Alias, Field, FieldValue, Keyword, Function, Identifier, str, bool]] = field(default_factory=list)
19+
args: list[
20+
Union[Alias, Field, FieldField, FieldValue, FunctionValue, Keyword, Function, Identifier, int, str, bool]
21+
] = field(default_factory=list)
1422
alias: Optional[Alias] = None
1523
raw: str = ""
1624

25+
@property
26+
def fields(self) -> list[Field]:
27+
fields = []
28+
for arg in self.args:
29+
if isinstance(arg, Field):
30+
fields.append(arg)
31+
elif isinstance(arg, (BaseFieldsGetter, Function)):
32+
fields.extend(arg.fields)
33+
34+
return fields
35+
1736

1837
@dataclass
1938
class ParsedFunctions:

uncoder-core/app/translator/core/models/functions/bin.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,15 @@
22
from typing import Optional
33

44
from app.translator.core.custom_types.functions import FunctionType
5-
from app.translator.core.models.field import Field
5+
from app.translator.core.custom_types.time import TimeFrameType
66
from app.translator.core.models.functions.base import Function
7-
from app.translator.tools.custom_enum import CustomEnum
8-
9-
10-
class SpanType(CustomEnum):
11-
days = "days"
12-
hours = "hours"
13-
minutes = "minutes"
7+
from app.translator.core.models.query_tokens.field import Field
148

159

1610
@dataclass
1711
class Span:
1812
value: str = "1"
19-
type_: str = SpanType.days
13+
type_: str = TimeFrameType.days
2014

2115

2216
@dataclass
@@ -25,3 +19,7 @@ class BinFunction(Function):
2519
span: Optional[Span] = None
2620
field: Optional[Field] = None
2721
bins: Optional[int] = None
22+
23+
@property
24+
def fields(self) -> list[Field]:
25+
return [self.field] if self.field else []

uncoder-core/app/translator/core/models/functions/eval.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
from typing import Union
33

44
from app.translator.core.custom_types.functions import FunctionType
5-
from app.translator.core.models.field import Alias, Field
65
from app.translator.core.models.functions.base import Function
7-
from app.translator.core.models.identifier import Identifier
6+
from app.translator.core.models.query_tokens.field import Alias, Field
7+
from app.translator.core.models.query_tokens.identifier import Identifier
88

99

1010
@dataclass
@@ -17,3 +17,16 @@ class EvalArg:
1717
class EvalFunction(Function):
1818
name: str = FunctionType.eval
1919
args: list[EvalArg] = None
20+
21+
@property
22+
def fields(self) -> list[Field]:
23+
fields = []
24+
for arg in self.args:
25+
if isinstance(arg.field_, Field):
26+
fields.append(arg.field_)
27+
for el in arg.expression:
28+
if isinstance(el, Field):
29+
fields.append(el)
30+
if isinstance(el, Function):
31+
fields.extend(el.fields)
32+
return fields
Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,27 @@
1-
from dataclasses import Field, dataclass, field
1+
from dataclasses import dataclass, field
22
from typing import Union
33

44
from app.translator.core.custom_types.functions import FunctionType
5-
from app.translator.core.models.field import Alias
65
from app.translator.core.models.functions.base import Function
6+
from app.translator.core.models.query_tokens.field import Alias, Field, PredefinedField
77

88

99
@dataclass
1010
class GroupByFunction(Function):
1111
name: str = FunctionType.stats
1212
args: list[Function] = field(default_factory=list)
13-
by_clauses: list[Union[Alias, Field]] = field(default_factory=list)
13+
by_clauses: list[Union[Alias, Field, PredefinedField]] = field(default_factory=list)
1414
filter_: Function = None
15+
16+
@property
17+
def fields(self) -> list[Field]:
18+
fields = []
19+
for arg in self.args:
20+
fields.extend(arg.fields)
21+
for by_clause in self.by_clauses:
22+
if isinstance(by_clause, Field):
23+
fields.append(by_clause)
24+
if self.filter_:
25+
fields.extend(self.filter_.fields)
26+
27+
return fields
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
from dataclasses import dataclass, field
2+
from typing import Union
3+
4+
from app.translator.core.custom_types.functions import FunctionType
5+
from app.translator.core.models.functions.base import Function
6+
from app.translator.core.models.query_container import TokenizedQueryContainer
7+
from app.translator.core.models.query_tokens.field import Alias, BaseFieldsGetter, Field
8+
from app.translator.core.models.query_tokens.field_field import FieldField
9+
from app.translator.core.models.query_tokens.field_value import FieldValue
10+
from app.translator.core.models.query_tokens.function_value import FunctionValue
11+
from app.translator.core.models.query_tokens.identifier import Identifier
12+
from app.translator.tools.custom_enum import CustomEnum
13+
14+
15+
class JoinType(CustomEnum):
16+
inner = "inner"
17+
left = "left"
18+
right = "right"
19+
cross = "cross"
20+
21+
22+
@dataclass
23+
class JoinFunction(Function):
24+
name: str = FunctionType.join
25+
alias: Alias = None
26+
type_: str = JoinType.inner
27+
tokenized_query_container: TokenizedQueryContainer = None
28+
condition: list[Union[FieldField, FieldValue, FunctionValue, Identifier]] = field(default_factory=list)
29+
preset_log_source_str: str = None
30+
31+
@property
32+
def fields(self) -> list[Field]:
33+
fields = []
34+
for arg in self.condition:
35+
if isinstance(arg, BaseFieldsGetter):
36+
fields.extend(arg.fields)
37+
38+
return fields

uncoder-core/app/translator/core/models/functions/rename.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
from dataclasses import dataclass
22

33
from app.translator.core.custom_types.functions import FunctionType
4-
from app.translator.core.models.field import Alias, Field
54
from app.translator.core.models.functions.base import Function
5+
from app.translator.core.models.query_tokens.field import Alias, Field
66

77

88
@dataclass
@@ -15,3 +15,11 @@ class RenameArg:
1515
class RenameFunction(Function):
1616
name: str = FunctionType.rename
1717
args: list[RenameArg] = None
18+
19+
@property
20+
def fields(self) -> list[Field]:
21+
fields = []
22+
for arg in self.args:
23+
fields.append(arg.field_)
24+
25+
return fields

uncoder-core/app/translator/core/models/functions/sort.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
from typing import Union
33

44
from app.translator.core.custom_types.functions import FunctionType
5-
from app.translator.core.models.field import Alias, Field
65
from app.translator.core.models.functions.base import Function
6+
from app.translator.core.models.query_tokens.field import Alias, Field
77
from app.translator.tools.custom_enum import CustomEnum
88

99

@@ -24,3 +24,15 @@ class SortLimitFunction(Function):
2424
name: str = FunctionType.sort_limit
2525
args: list[SortArg] = None
2626
limit: str = None
27+
28+
@property
29+
def fields(self) -> list[Field]:
30+
fields = []
31+
for arg in self.args:
32+
if isinstance(arg.field, Field):
33+
fields.append(arg.field)
34+
35+
if arg.function:
36+
fields.extend(arg.function.fields)
37+
38+
return fields

0 commit comments

Comments
 (0)