Skip to content

Commit 94e16aa

Browse files
authored
Merge pull request #183 from UncoderIO/gis-7887
update field tokens collection
2 parents 656b101 + 2dd3146 commit 94e16aa

File tree

14 files changed

+121
-66
lines changed

14 files changed

+121
-66
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from dataclasses import dataclass, field
44
from typing import TYPE_CHECKING, Optional, Union
55

6-
from app.translator.core.models.query_tokens.field import Alias, Field
6+
from app.translator.core.models.query_tokens.field import Alias, BaseFieldsGetter, Field
77
from app.translator.core.models.query_tokens.field_field import FieldField
88
from app.translator.core.models.query_tokens.field_value import FieldValue
99
from app.translator.core.models.query_tokens.identifier import Identifier
@@ -14,14 +14,25 @@
1414

1515

1616
@dataclass
17-
class Function:
17+
class Function(BaseFieldsGetter):
1818
name: str = None
1919
args: list[
2020
Union[Alias, Field, FieldField, FieldValue, FunctionValue, Keyword, Function, Identifier, int, str, bool]
2121
] = field(default_factory=list)
2222
alias: Optional[Alias] = None
2323
raw: str = ""
2424

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+
2536

2637
@dataclass
2738
class ParsedFunctions:

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ class BinFunction(Function):
1919
span: Optional[Span] = None
2020
field: Optional[Field] = None
2121
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: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
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
55
from app.translator.core.models.functions.base import Function
6-
from app.translator.core.models.query_tokens.field import Alias, PredefinedField
6+
from app.translator.core.models.query_tokens.field import Alias, Field, PredefinedField
77

88

99
@dataclass
@@ -12,3 +12,16 @@ class GroupByFunction(Function):
1212
args: list[Function] = field(default_factory=list)
1313
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

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
from app.translator.core.custom_types.functions import FunctionType
55
from app.translator.core.models.functions.base import Function
66
from app.translator.core.models.query_container import TokenizedQueryContainer
7-
from app.translator.core.models.query_tokens.field import Alias, Field
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
811
from app.translator.core.models.query_tokens.identifier import Identifier
912
from app.translator.tools.custom_enum import CustomEnum
1013

@@ -22,5 +25,14 @@ class JoinFunction(Function):
2225
alias: Alias = None
2326
type_: str = JoinType.inner
2427
tokenized_query_container: TokenizedQueryContainer = None
25-
condition: list[Union[Alias, Field, Identifier]] = field(default_factory=list)
28+
condition: list[Union[FieldField, FieldValue, FunctionValue, Identifier]] = field(default_factory=list)
2629
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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33
from app.translator.core.custom_types.functions import FunctionType
44
from app.translator.core.models.functions.base import Function
55
from app.translator.core.models.query_container import TokenizedQueryContainer
6+
from app.translator.core.models.query_tokens.field import Field
67

78

89
@dataclass
910
class UnionFunction(Function):
1011
name: str = FunctionType.union
1112
tokenized_query_container: TokenizedQueryContainer = None
1213
preset_log_source_str: str = None
14+
15+
@property
16+
def fields(self) -> list[Field]:
17+
return []

uncoder-core/app/translator/core/models/query_tokens/field.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from abc import ABC, abstractmethod
12
from typing import Optional
23

34
from app.translator.core.mapping import DEFAULT_MAPPING_NAME, SourceMapping
@@ -37,3 +38,10 @@ def set_generic_names_map(self, source_mappings: list[SourceMapping], default_ma
3738
class PredefinedField:
3839
def __init__(self, name: str):
3940
self.name = name
41+
42+
43+
class BaseFieldsGetter(ABC):
44+
@property
45+
@abstractmethod
46+
def fields(self) -> list[Field]:
47+
raise NotImplementedError("Abstract method")

uncoder-core/app/translator/core/models/query_tokens/field_field.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
from app.translator.core.models.query_tokens.field import Alias, Field
1+
from app.translator.core.models.query_tokens.field import Alias, BaseFieldsGetter, Field
22
from app.translator.core.models.query_tokens.identifier import Identifier
33

44

5-
class FieldField:
5+
class FieldField(BaseFieldsGetter):
66
def __init__(
77
self,
88
source_name_left: str,
@@ -16,3 +16,13 @@ def __init__(
1616
self.operator = operator
1717
self.field_right = Field(source_name=source_name_right) if not is_alias_right else None
1818
self.alias_right = Alias(name=source_name_right) if is_alias_right else None
19+
20+
@property
21+
def fields(self) -> list[Field]:
22+
fields = []
23+
if self.field_left:
24+
fields.append(self.field_left)
25+
if self.field_right:
26+
fields.append(self.field_right)
27+
28+
return fields

0 commit comments

Comments
 (0)