pylegend 0.3.0__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pylegend/__init__.py +16 -6
- pylegend/core/{databse → database}/sql_to_string/__init__.py +3 -3
- pylegend/core/{databse → database}/sql_to_string/db_extension.py +14 -5
- pylegend/core/{databse → database}/sql_to_string/generator.py +2 -2
- pylegend/core/language/__init__.py +12 -10
- pylegend/core/language/legacy_api/__init__.py +13 -0
- pylegend/core/language/{aggregate_specification.py → legacy_api/aggregate_specification.py} +10 -10
- pylegend/core/language/legacy_api/legacy_api_tds_row.py +32 -0
- pylegend/core/language/legendql_api/__init__.py +13 -0
- pylegend/core/language/legendql_api/legendql_api_custom_expressions.py +541 -0
- pylegend/core/language/legendql_api/legendql_api_tds_row.py +292 -0
- pylegend/core/language/shared/__init__.py +13 -0
- pylegend/core/language/{column_expressions.py → shared/column_expressions.py} +32 -31
- pylegend/core/language/{expression.py → shared/expression.py} +8 -0
- pylegend/core/language/{functions.py → shared/functions.py} +12 -3
- pylegend/core/language/shared/helpers.py +75 -0
- pylegend/core/language/{literal_expressions.py → shared/literal_expressions.py} +39 -1
- pylegend/core/language/{operations → shared/operations}/binary_expression.py +34 -2
- pylegend/core/language/{operations → shared/operations}/boolean_operation_expressions.py +34 -6
- pylegend/core/language/{operations → shared/operations}/collection_operation_expressions.py +146 -26
- pylegend/core/language/{operations → shared/operations}/date_operation_expressions.py +288 -24
- pylegend/core/language/{operations → shared/operations}/float_operation_expressions.py +53 -8
- pylegend/core/language/{operations → shared/operations}/integer_operation_expressions.py +62 -9
- pylegend/core/language/{operations → shared/operations}/nullary_expression.py +9 -2
- pylegend/core/language/{operations → shared/operations}/number_operation_expressions.py +211 -30
- pylegend/core/language/shared/operations/primitive_operation_expressions.py +155 -0
- pylegend/core/language/{operations → shared/operations}/string_operation_expressions.py +194 -21
- pylegend/core/language/{operations → shared/operations}/unary_expression.py +10 -2
- pylegend/core/language/{primitive_collection.py → shared/primitive_collection.py} +2 -2
- pylegend/core/language/{primitives → shared/primitives}/__init__.py +9 -9
- pylegend/core/language/{primitives → shared/primitives}/boolean.py +9 -5
- pylegend/core/language/{primitives → shared/primitives}/date.py +60 -15
- pylegend/core/language/{primitives → shared/primitives}/datetime.py +4 -5
- pylegend/core/language/{primitives → shared/primitives}/float.py +6 -6
- pylegend/core/language/{primitives → shared/primitives}/integer.py +6 -6
- pylegend/core/language/{primitives → shared/primitives}/number.py +16 -13
- pylegend/core/language/{primitives → shared/primitives}/primitive.py +41 -5
- pylegend/core/language/{primitives → shared/primitives}/strictdate.py +4 -5
- pylegend/core/language/{primitives → shared/primitives}/string.py +18 -19
- pylegend/core/language/{tds_row.py → shared/tds_row.py} +46 -16
- pylegend/core/request/__init__.py +7 -1
- pylegend/core/request/auth.py +55 -1
- pylegend/core/request/legend_client.py +32 -0
- pylegend/core/sql/metamodel_extension.py +28 -0
- pylegend/core/tds/abstract/__init__.py +13 -0
- pylegend/core/tds/abstract/frames/__init__.py +13 -0
- pylegend/core/tds/{legend_api/frames/legend_api_applied_function_tds_frame.py → abstract/frames/applied_function_tds_frame.py} +19 -13
- pylegend/core/tds/abstract/frames/base_tds_frame.py +125 -0
- pylegend/core/tds/{legend_api/frames/legend_api_input_tds_frame.py → abstract/frames/input_tds_frame.py} +9 -12
- pylegend/core/tds/{legend_api/frames/functions → abstract}/function_helpers.py +1 -1
- pylegend/core/tds/{legend_api/frames/functions/concatenate_function.py → legacy_api/frames/functions/legacy_api_concatenate_function.py} +25 -13
- pylegend/core/tds/{legend_api/frames/functions/distinct_function.py → legacy_api/frames/functions/legacy_api_distinct_function.py} +13 -8
- pylegend/core/tds/{legend_api/frames/functions/drop_function.py → legacy_api/frames/functions/legacy_api_drop_function.py} +13 -8
- pylegend/core/tds/{legend_api/frames/functions/extend_function.py → legacy_api/frames/functions/legacy_api_extend_function.py} +36 -16
- pylegend/core/tds/{legend_api/frames/functions/filter_function.py → legacy_api/frames/functions/legacy_api_filter_function.py} +25 -13
- pylegend/core/tds/{legend_api/frames/functions/group_by_function.py → legacy_api/frames/functions/legacy_api_group_by_function.py} +44 -17
- pylegend/core/tds/{legend_api/frames/functions/head_function.py → legacy_api/frames/functions/legacy_api_head_function.py} +13 -8
- pylegend/core/tds/{legend_api/frames/functions/join_by_columns_function.py → legacy_api/frames/functions/legacy_api_join_by_columns_function.py} +40 -13
- pylegend/core/tds/{legend_api/frames/functions/join_function.py → legacy_api/frames/functions/legacy_api_join_function.py} +44 -20
- pylegend/core/tds/{legend_api/frames/functions/rename_columns_function.py → legacy_api/frames/functions/legacy_api_rename_columns_function.py} +20 -8
- pylegend/core/tds/{legend_api/frames/functions/restrict_function.py → legacy_api/frames/functions/legacy_api_restrict_function.py} +17 -8
- pylegend/core/tds/{legend_api/frames/functions/slice_function.py → legacy_api/frames/functions/legacy_api_slice_function.py} +13 -8
- pylegend/core/tds/{legend_api/frames/functions/sort_function.py → legacy_api/frames/functions/legacy_api_sort_function.py} +19 -8
- pylegend/core/tds/legacy_api/frames/legacy_api_applied_function_tds_frame.py +37 -0
- pylegend/core/tds/legacy_api/frames/legacy_api_base_tds_frame.py +204 -0
- pylegend/core/tds/legacy_api/frames/legacy_api_input_tds_frame.py +51 -0
- pylegend/core/tds/{legend_api/frames/legend_api_tds_frame.py → legacy_api/frames/legacy_api_tds_frame.py} +28 -28
- pylegend/core/tds/legendql_api/__init__.py +13 -0
- pylegend/core/tds/legendql_api/frames/__init__.py +13 -0
- pylegend/core/tds/legendql_api/frames/functions/__init__.py +13 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_asofjoin_function.py +156 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_concatenate_function.py +139 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_distinct_function.py +69 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_drop_function.py +74 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_extend_function.py +256 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_filter_function.py +121 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_function_helpers.py +137 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_groupby_function.py +256 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_head_function.py +74 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_join_function.py +214 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_project_function.py +169 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_rename_function.py +189 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_select_function.py +131 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_slice_function.py +82 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_sort_function.py +93 -0
- pylegend/core/tds/legendql_api/frames/functions/legendql_api_window_extend_function.py +283 -0
- pylegend/core/tds/legendql_api/frames/legendql_api_applied_function_tds_frame.py +37 -0
- pylegend/core/tds/legendql_api/frames/legendql_api_base_tds_frame.py +419 -0
- pylegend/core/tds/legendql_api/frames/legendql_api_input_tds_frame.py +50 -0
- pylegend/core/tds/legendql_api/frames/legendql_api_tds_frame.py +327 -0
- pylegend/core/tds/pandas_api/frames/functions/assign_function.py +6 -6
- pylegend/core/tds/pandas_api/frames/pandas_api_applied_function_tds_frame.py +4 -0
- pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py +11 -3
- pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py +2 -2
- pylegend/core/tds/tds_frame.py +32 -2
- pylegend/extensions/database/vendors/postgres/postgres_sql_to_string.py +1 -1
- pylegend/extensions/tds/abstract/legend_function_input_frame.py +4 -0
- pylegend/extensions/tds/abstract/legend_service_input_frame.py +4 -0
- pylegend/extensions/tds/abstract/table_spec_input_frame.py +4 -0
- pylegend/extensions/tds/{legend_api/frames/legend_api_legend_function_input_frame.py → legacy_api/frames/legacy_api_legend_function_input_frame.py} +5 -5
- pylegend/extensions/tds/{legend_api/frames/legend_api_legend_service_input_frame.py → legacy_api/frames/legacy_api_legend_service_input_frame.py} +6 -6
- pylegend/extensions/tds/{legend_api/frames/legend_api_table_spec_input_frame.py → legacy_api/frames/legacy_api_table_spec_input_frame.py} +5 -5
- pylegend/extensions/tds/legendql_api/__init__.py +13 -0
- pylegend/extensions/tds/legendql_api/frames/__init__.py +13 -0
- pylegend/extensions/tds/legendql_api/frames/legendql_api_legend_service_input_frame.py +46 -0
- pylegend/extensions/tds/legendql_api/frames/legendql_api_table_spec_input_frame.py +36 -0
- pylegend/{legend_api_tds_client.py → legacy_api_tds_client.py} +15 -15
- {pylegend-0.3.0.dist-info → pylegend-0.5.0.dist-info}/METADATA +7 -8
- pylegend-0.5.0.dist-info/NOTICE +5 -0
- pylegend-0.5.0.dist-info/RECORD +155 -0
- {pylegend-0.3.0.dist-info → pylegend-0.5.0.dist-info}/WHEEL +1 -1
- pylegend/core/language/operations/primitive_operation_expressions.py +0 -56
- pylegend/core/tds/legend_api/frames/legend_api_base_tds_frame.py +0 -294
- pylegend-0.3.0.dist-info/RECORD +0 -115
- /pylegend/core/{databse → database}/__init__.py +0 -0
- /pylegend/core/{databse → database}/sql_to_string/config.py +0 -0
- /pylegend/core/language/{operations → shared/operations}/__init__.py +0 -0
- /pylegend/core/tds/{legend_api → legacy_api}/__init__.py +0 -0
- /pylegend/core/tds/{legend_api → legacy_api}/frames/__init__.py +0 -0
- /pylegend/core/tds/{legend_api → legacy_api}/frames/functions/__init__.py +0 -0
- /pylegend/extensions/tds/{legend_api → legacy_api}/__init__.py +0 -0
- /pylegend/extensions/tds/{legend_api → legacy_api}/frames/__init__.py +0 -0
- {pylegend-0.3.0.dist-info → pylegend-0.5.0.dist-info}/LICENSE +0 -0
- {pylegend-0.3.0.dist-info → pylegend-0.5.0.dist-info}/LICENSE.spdx +0 -0
|
@@ -16,11 +16,12 @@ from pylegend._typing import (
|
|
|
16
16
|
PyLegendSequence,
|
|
17
17
|
PyLegendDict,
|
|
18
18
|
)
|
|
19
|
-
from pylegend.core.language.expression import (
|
|
19
|
+
from pylegend.core.language.shared.expression import (
|
|
20
20
|
PyLegendExpressionFloatReturn,
|
|
21
21
|
)
|
|
22
|
-
from pylegend.core.language.operations.binary_expression import PyLegendBinaryExpression
|
|
23
|
-
from pylegend.core.language.operations.unary_expression import PyLegendUnaryExpression
|
|
22
|
+
from pylegend.core.language.shared.operations.binary_expression import PyLegendBinaryExpression
|
|
23
|
+
from pylegend.core.language.shared.operations.unary_expression import PyLegendUnaryExpression
|
|
24
|
+
from pylegend.core.language.shared.helpers import generate_pure_functional_call
|
|
24
25
|
from pylegend.core.sql.metamodel import (
|
|
25
26
|
Expression,
|
|
26
27
|
QuerySpecification,
|
|
@@ -32,6 +33,7 @@ from pylegend.core.sql.metamodel_extension import (
|
|
|
32
33
|
AbsoluteExpression,
|
|
33
34
|
)
|
|
34
35
|
from pylegend.core.tds.tds_frame import FrameToSqlConfig
|
|
36
|
+
from pylegend.core.tds.tds_frame import FrameToPureConfig
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
__all__: PyLegendSequence[str] = [
|
|
@@ -54,15 +56,26 @@ class PyLegendFloatAddExpression(PyLegendBinaryExpression, PyLegendExpressionFlo
|
|
|
54
56
|
) -> Expression:
|
|
55
57
|
return ArithmeticExpression(ArithmeticType.ADD, expression1, expression2)
|
|
56
58
|
|
|
59
|
+
@staticmethod
|
|
60
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
61
|
+
return f"({op1_expr} + {op2_expr})"
|
|
62
|
+
|
|
57
63
|
def __init__(self, operand1: PyLegendExpressionFloatReturn, operand2: PyLegendExpressionFloatReturn) -> None:
|
|
58
64
|
PyLegendExpressionFloatReturn.__init__(self)
|
|
59
65
|
PyLegendBinaryExpression.__init__(
|
|
60
66
|
self,
|
|
61
67
|
operand1,
|
|
62
68
|
operand2,
|
|
63
|
-
PyLegendFloatAddExpression.__to_sql_func
|
|
69
|
+
PyLegendFloatAddExpression.__to_sql_func,
|
|
70
|
+
PyLegendFloatAddExpression.__to_pure_func
|
|
64
71
|
)
|
|
65
72
|
|
|
73
|
+
def is_non_nullable(self) -> bool:
|
|
74
|
+
return True
|
|
75
|
+
|
|
76
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
77
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
78
|
+
|
|
66
79
|
|
|
67
80
|
class PyLegendFloatSubtractExpression(PyLegendBinaryExpression, PyLegendExpressionFloatReturn):
|
|
68
81
|
|
|
@@ -75,15 +88,26 @@ class PyLegendFloatSubtractExpression(PyLegendBinaryExpression, PyLegendExpressi
|
|
|
75
88
|
) -> Expression:
|
|
76
89
|
return ArithmeticExpression(ArithmeticType.SUBTRACT, expression1, expression2)
|
|
77
90
|
|
|
91
|
+
@staticmethod
|
|
92
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
93
|
+
return f"({op1_expr} - {op2_expr})"
|
|
94
|
+
|
|
78
95
|
def __init__(self, operand1: PyLegendExpressionFloatReturn, operand2: PyLegendExpressionFloatReturn) -> None:
|
|
79
96
|
PyLegendExpressionFloatReturn.__init__(self)
|
|
80
97
|
PyLegendBinaryExpression.__init__(
|
|
81
98
|
self,
|
|
82
99
|
operand1,
|
|
83
100
|
operand2,
|
|
84
|
-
PyLegendFloatSubtractExpression.__to_sql_func
|
|
101
|
+
PyLegendFloatSubtractExpression.__to_sql_func,
|
|
102
|
+
PyLegendFloatSubtractExpression.__to_pure_func
|
|
85
103
|
)
|
|
86
104
|
|
|
105
|
+
def is_non_nullable(self) -> bool:
|
|
106
|
+
return True
|
|
107
|
+
|
|
108
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
109
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
110
|
+
|
|
87
111
|
|
|
88
112
|
class PyLegendFloatMultiplyExpression(PyLegendBinaryExpression, PyLegendExpressionFloatReturn):
|
|
89
113
|
|
|
@@ -96,15 +120,26 @@ class PyLegendFloatMultiplyExpression(PyLegendBinaryExpression, PyLegendExpressi
|
|
|
96
120
|
) -> Expression:
|
|
97
121
|
return ArithmeticExpression(ArithmeticType.MULTIPLY, expression1, expression2)
|
|
98
122
|
|
|
123
|
+
@staticmethod
|
|
124
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
125
|
+
return f"({op1_expr} * {op2_expr})"
|
|
126
|
+
|
|
99
127
|
def __init__(self, operand1: PyLegendExpressionFloatReturn, operand2: PyLegendExpressionFloatReturn) -> None:
|
|
100
128
|
PyLegendExpressionFloatReturn.__init__(self)
|
|
101
129
|
PyLegendBinaryExpression.__init__(
|
|
102
130
|
self,
|
|
103
131
|
operand1,
|
|
104
132
|
operand2,
|
|
105
|
-
PyLegendFloatMultiplyExpression.__to_sql_func
|
|
133
|
+
PyLegendFloatMultiplyExpression.__to_sql_func,
|
|
134
|
+
PyLegendFloatMultiplyExpression.__to_pure_func
|
|
106
135
|
)
|
|
107
136
|
|
|
137
|
+
def is_non_nullable(self) -> bool:
|
|
138
|
+
return True
|
|
139
|
+
|
|
140
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
141
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
142
|
+
|
|
108
143
|
|
|
109
144
|
class PyLegendFloatAbsoluteExpression(PyLegendUnaryExpression, PyLegendExpressionFloatReturn):
|
|
110
145
|
|
|
@@ -116,12 +151,17 @@ class PyLegendFloatAbsoluteExpression(PyLegendUnaryExpression, PyLegendExpressio
|
|
|
116
151
|
) -> Expression:
|
|
117
152
|
return AbsoluteExpression(expression)
|
|
118
153
|
|
|
154
|
+
@staticmethod
|
|
155
|
+
def __to_pure_func(op_expr: str, config: FrameToPureConfig) -> str:
|
|
156
|
+
return generate_pure_functional_call("abs", [op_expr], auto_map=True)
|
|
157
|
+
|
|
119
158
|
def __init__(self, operand: PyLegendExpressionFloatReturn) -> None:
|
|
120
159
|
PyLegendExpressionFloatReturn.__init__(self)
|
|
121
160
|
PyLegendUnaryExpression.__init__(
|
|
122
161
|
self,
|
|
123
162
|
operand,
|
|
124
|
-
PyLegendFloatAbsoluteExpression.__to_sql_func
|
|
163
|
+
PyLegendFloatAbsoluteExpression.__to_sql_func,
|
|
164
|
+
PyLegendFloatAbsoluteExpression.__to_pure_func
|
|
125
165
|
)
|
|
126
166
|
|
|
127
167
|
|
|
@@ -135,10 +175,15 @@ class PyLegendFloatNegativeExpression(PyLegendUnaryExpression, PyLegendExpressio
|
|
|
135
175
|
) -> Expression:
|
|
136
176
|
return NegativeExpression(expression)
|
|
137
177
|
|
|
178
|
+
@staticmethod
|
|
179
|
+
def __to_pure_func(op_expr: str, config: FrameToPureConfig) -> str:
|
|
180
|
+
return generate_pure_functional_call("minus", [op_expr], auto_map=True)
|
|
181
|
+
|
|
138
182
|
def __init__(self, operand: PyLegendExpressionFloatReturn) -> None:
|
|
139
183
|
PyLegendExpressionFloatReturn.__init__(self)
|
|
140
184
|
PyLegendUnaryExpression.__init__(
|
|
141
185
|
self,
|
|
142
186
|
operand,
|
|
143
|
-
PyLegendFloatNegativeExpression.__to_sql_func
|
|
187
|
+
PyLegendFloatNegativeExpression.__to_sql_func,
|
|
188
|
+
PyLegendFloatNegativeExpression.__to_pure_func
|
|
144
189
|
)
|
|
@@ -16,11 +16,12 @@ from pylegend._typing import (
|
|
|
16
16
|
PyLegendSequence,
|
|
17
17
|
PyLegendDict,
|
|
18
18
|
)
|
|
19
|
-
from pylegend.core.language.expression import (
|
|
19
|
+
from pylegend.core.language.shared.expression import (
|
|
20
20
|
PyLegendExpressionIntegerReturn,
|
|
21
21
|
)
|
|
22
|
-
from pylegend.core.language.operations.binary_expression import PyLegendBinaryExpression
|
|
23
|
-
from pylegend.core.language.operations.unary_expression import PyLegendUnaryExpression
|
|
22
|
+
from pylegend.core.language.shared.operations.binary_expression import PyLegendBinaryExpression
|
|
23
|
+
from pylegend.core.language.shared.operations.unary_expression import PyLegendUnaryExpression
|
|
24
|
+
from pylegend.core.language.shared.helpers import generate_pure_functional_call
|
|
24
25
|
from pylegend.core.sql.metamodel import (
|
|
25
26
|
Expression,
|
|
26
27
|
QuerySpecification,
|
|
@@ -32,6 +33,7 @@ from pylegend.core.sql.metamodel_extension import (
|
|
|
32
33
|
AbsoluteExpression,
|
|
33
34
|
)
|
|
34
35
|
from pylegend.core.tds.tds_frame import FrameToSqlConfig
|
|
36
|
+
from pylegend.core.tds.tds_frame import FrameToPureConfig
|
|
35
37
|
|
|
36
38
|
|
|
37
39
|
__all__: PyLegendSequence[str] = [
|
|
@@ -55,15 +57,26 @@ class PyLegendIntegerAddExpression(PyLegendBinaryExpression, PyLegendExpressionI
|
|
|
55
57
|
) -> Expression:
|
|
56
58
|
return ArithmeticExpression(ArithmeticType.ADD, expression1, expression2)
|
|
57
59
|
|
|
60
|
+
@staticmethod
|
|
61
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
62
|
+
return f"({op1_expr} + {op2_expr})"
|
|
63
|
+
|
|
58
64
|
def __init__(self, operand1: PyLegendExpressionIntegerReturn, operand2: PyLegendExpressionIntegerReturn) -> None:
|
|
59
65
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
60
66
|
PyLegendBinaryExpression.__init__(
|
|
61
67
|
self,
|
|
62
68
|
operand1,
|
|
63
69
|
operand2,
|
|
64
|
-
PyLegendIntegerAddExpression.__to_sql_func
|
|
70
|
+
PyLegendIntegerAddExpression.__to_sql_func,
|
|
71
|
+
PyLegendIntegerAddExpression.__to_pure_func
|
|
65
72
|
)
|
|
66
73
|
|
|
74
|
+
def is_non_nullable(self) -> bool:
|
|
75
|
+
return True
|
|
76
|
+
|
|
77
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
78
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
79
|
+
|
|
67
80
|
|
|
68
81
|
class PyLegendIntegerSubtractExpression(PyLegendBinaryExpression, PyLegendExpressionIntegerReturn):
|
|
69
82
|
|
|
@@ -76,15 +89,26 @@ class PyLegendIntegerSubtractExpression(PyLegendBinaryExpression, PyLegendExpres
|
|
|
76
89
|
) -> Expression:
|
|
77
90
|
return ArithmeticExpression(ArithmeticType.SUBTRACT, expression1, expression2)
|
|
78
91
|
|
|
92
|
+
@staticmethod
|
|
93
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
94
|
+
return f"({op1_expr} - {op2_expr})"
|
|
95
|
+
|
|
79
96
|
def __init__(self, operand1: PyLegendExpressionIntegerReturn, operand2: PyLegendExpressionIntegerReturn) -> None:
|
|
80
97
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
81
98
|
PyLegendBinaryExpression.__init__(
|
|
82
99
|
self,
|
|
83
100
|
operand1,
|
|
84
101
|
operand2,
|
|
85
|
-
PyLegendIntegerSubtractExpression.__to_sql_func
|
|
102
|
+
PyLegendIntegerSubtractExpression.__to_sql_func,
|
|
103
|
+
PyLegendIntegerSubtractExpression.__to_pure_func
|
|
86
104
|
)
|
|
87
105
|
|
|
106
|
+
def is_non_nullable(self) -> bool:
|
|
107
|
+
return True
|
|
108
|
+
|
|
109
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
110
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
111
|
+
|
|
88
112
|
|
|
89
113
|
class PyLegendIntegerMultiplyExpression(PyLegendBinaryExpression, PyLegendExpressionIntegerReturn):
|
|
90
114
|
|
|
@@ -97,15 +121,26 @@ class PyLegendIntegerMultiplyExpression(PyLegendBinaryExpression, PyLegendExpres
|
|
|
97
121
|
) -> Expression:
|
|
98
122
|
return ArithmeticExpression(ArithmeticType.MULTIPLY, expression1, expression2)
|
|
99
123
|
|
|
124
|
+
@staticmethod
|
|
125
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
126
|
+
return f"({op1_expr} * {op2_expr})"
|
|
127
|
+
|
|
100
128
|
def __init__(self, operand1: PyLegendExpressionIntegerReturn, operand2: PyLegendExpressionIntegerReturn) -> None:
|
|
101
129
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
102
130
|
PyLegendBinaryExpression.__init__(
|
|
103
131
|
self,
|
|
104
132
|
operand1,
|
|
105
133
|
operand2,
|
|
106
|
-
PyLegendIntegerMultiplyExpression.__to_sql_func
|
|
134
|
+
PyLegendIntegerMultiplyExpression.__to_sql_func,
|
|
135
|
+
PyLegendIntegerMultiplyExpression.__to_pure_func
|
|
107
136
|
)
|
|
108
137
|
|
|
138
|
+
def is_non_nullable(self) -> bool:
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
142
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_both_operands(self, config)
|
|
143
|
+
|
|
109
144
|
|
|
110
145
|
class PyLegendIntegerModuloExpression(PyLegendBinaryExpression, PyLegendExpressionIntegerReturn):
|
|
111
146
|
|
|
@@ -118,15 +153,23 @@ class PyLegendIntegerModuloExpression(PyLegendBinaryExpression, PyLegendExpressi
|
|
|
118
153
|
) -> Expression:
|
|
119
154
|
return ArithmeticExpression(ArithmeticType.MODULUS, expression1, expression2)
|
|
120
155
|
|
|
156
|
+
@staticmethod
|
|
157
|
+
def __to_pure_func(op1_expr: str, op2_expr: str, config: FrameToPureConfig) -> str:
|
|
158
|
+
return generate_pure_functional_call("mod", [op1_expr, op2_expr], auto_map=True)
|
|
159
|
+
|
|
121
160
|
def __init__(self, operand1: PyLegendExpressionIntegerReturn, operand2: PyLegendExpressionIntegerReturn) -> None:
|
|
122
161
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
123
162
|
PyLegendBinaryExpression.__init__(
|
|
124
163
|
self,
|
|
125
164
|
operand1,
|
|
126
165
|
operand2,
|
|
127
|
-
PyLegendIntegerModuloExpression.__to_sql_func
|
|
166
|
+
PyLegendIntegerModuloExpression.__to_sql_func,
|
|
167
|
+
PyLegendIntegerModuloExpression.__to_pure_func
|
|
128
168
|
)
|
|
129
169
|
|
|
170
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
171
|
+
return PyLegendBinaryExpression.to_pure_expression_with_to_one_on_second_operand(self, config)
|
|
172
|
+
|
|
130
173
|
|
|
131
174
|
class PyLegendIntegerAbsoluteExpression(PyLegendUnaryExpression, PyLegendExpressionIntegerReturn):
|
|
132
175
|
|
|
@@ -138,12 +181,17 @@ class PyLegendIntegerAbsoluteExpression(PyLegendUnaryExpression, PyLegendExpress
|
|
|
138
181
|
) -> Expression:
|
|
139
182
|
return AbsoluteExpression(expression)
|
|
140
183
|
|
|
184
|
+
@staticmethod
|
|
185
|
+
def __to_pure_func(op_expr: str, config: FrameToPureConfig) -> str:
|
|
186
|
+
return generate_pure_functional_call("abs", [op_expr], auto_map=True)
|
|
187
|
+
|
|
141
188
|
def __init__(self, operand: PyLegendExpressionIntegerReturn) -> None:
|
|
142
189
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
143
190
|
PyLegendUnaryExpression.__init__(
|
|
144
191
|
self,
|
|
145
192
|
operand,
|
|
146
|
-
PyLegendIntegerAbsoluteExpression.__to_sql_func
|
|
193
|
+
PyLegendIntegerAbsoluteExpression.__to_sql_func,
|
|
194
|
+
PyLegendIntegerAbsoluteExpression.__to_pure_func
|
|
147
195
|
)
|
|
148
196
|
|
|
149
197
|
|
|
@@ -157,10 +205,15 @@ class PyLegendIntegerNegativeExpression(PyLegendUnaryExpression, PyLegendExpress
|
|
|
157
205
|
) -> Expression:
|
|
158
206
|
return NegativeExpression(expression)
|
|
159
207
|
|
|
208
|
+
@staticmethod
|
|
209
|
+
def __to_pure_func(op_expr: str, config: FrameToPureConfig) -> str:
|
|
210
|
+
return generate_pure_functional_call("minus", [op_expr], auto_map=True)
|
|
211
|
+
|
|
160
212
|
def __init__(self, operand: PyLegendExpressionIntegerReturn) -> None:
|
|
161
213
|
PyLegendExpressionIntegerReturn.__init__(self)
|
|
162
214
|
PyLegendUnaryExpression.__init__(
|
|
163
215
|
self,
|
|
164
216
|
operand,
|
|
165
|
-
PyLegendIntegerNegativeExpression.__to_sql_func
|
|
217
|
+
PyLegendIntegerNegativeExpression.__to_sql_func,
|
|
218
|
+
PyLegendIntegerNegativeExpression.__to_pure_func
|
|
166
219
|
)
|
|
@@ -18,7 +18,7 @@ from pylegend._typing import (
|
|
|
18
18
|
PyLegendDict,
|
|
19
19
|
PyLegendCallable,
|
|
20
20
|
)
|
|
21
|
-
from pylegend.core.language.expression import (
|
|
21
|
+
from pylegend.core.language.shared.expression import (
|
|
22
22
|
PyLegendExpression,
|
|
23
23
|
)
|
|
24
24
|
from pylegend.core.sql.metamodel import (
|
|
@@ -26,6 +26,7 @@ from pylegend.core.sql.metamodel import (
|
|
|
26
26
|
QuerySpecification,
|
|
27
27
|
)
|
|
28
28
|
from pylegend.core.tds.tds_frame import FrameToSqlConfig
|
|
29
|
+
from pylegend.core.tds.tds_frame import FrameToPureConfig
|
|
29
30
|
|
|
30
31
|
|
|
31
32
|
__all__: PyLegendSequence[str] = [
|
|
@@ -38,15 +39,18 @@ class PyLegendNullaryExpression(PyLegendExpression, metaclass=ABCMeta):
|
|
|
38
39
|
[PyLegendDict[str, QuerySpecification], FrameToSqlConfig],
|
|
39
40
|
Expression
|
|
40
41
|
]
|
|
42
|
+
__to_pure_func: PyLegendCallable[[FrameToPureConfig], str]
|
|
41
43
|
|
|
42
44
|
def __init__(
|
|
43
45
|
self,
|
|
44
46
|
to_sql_func: PyLegendCallable[
|
|
45
47
|
[PyLegendDict[str, QuerySpecification], FrameToSqlConfig],
|
|
46
48
|
Expression
|
|
47
|
-
]
|
|
49
|
+
],
|
|
50
|
+
to_pure_func: PyLegendCallable[[FrameToPureConfig], str]
|
|
48
51
|
) -> None:
|
|
49
52
|
self.__to_sql_func = to_sql_func
|
|
53
|
+
self.__to_pure_func = to_pure_func
|
|
50
54
|
|
|
51
55
|
def to_sql_expression(
|
|
52
56
|
self,
|
|
@@ -57,3 +61,6 @@ class PyLegendNullaryExpression(PyLegendExpression, metaclass=ABCMeta):
|
|
|
57
61
|
frame_name_to_base_query_map,
|
|
58
62
|
config
|
|
59
63
|
)
|
|
64
|
+
|
|
65
|
+
def to_pure_expression(self, config: FrameToPureConfig) -> str:
|
|
66
|
+
return self.__to_pure_func(config)
|