pylegend 0.2.2__py3-none-any.whl → 0.4.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.
Files changed (123) hide show
  1. pylegend/__init__.py +9 -5
  2. pylegend/core/{databse → database}/sql_to_string/__init__.py +3 -3
  3. pylegend/core/{databse → database}/sql_to_string/db_extension.py +11 -5
  4. pylegend/core/{databse → database}/sql_to_string/generator.py +2 -2
  5. pylegend/core/language/__init__.py +10 -10
  6. pylegend/core/language/legacy_api/__init__.py +13 -0
  7. pylegend/core/language/{aggregate_specification.py → legacy_api/aggregate_specification.py} +10 -10
  8. pylegend/core/language/legacy_api/legacy_api_tds_row.py +32 -0
  9. pylegend/core/language/legendql_api/__init__.py +13 -0
  10. pylegend/core/language/legendql_api/legendql_api_custom_expressions.py +541 -0
  11. pylegend/core/language/legendql_api/legendql_api_tds_row.py +292 -0
  12. pylegend/core/language/shared/__init__.py +13 -0
  13. pylegend/core/language/{column_expressions.py → shared/column_expressions.py} +32 -31
  14. pylegend/core/language/{expression.py → shared/expression.py} +8 -0
  15. pylegend/core/language/{functions.py → shared/functions.py} +3 -3
  16. pylegend/core/language/shared/helpers.py +75 -0
  17. pylegend/core/language/{literal_expressions.py → shared/literal_expressions.py} +39 -1
  18. pylegend/core/language/{operations → shared/operations}/binary_expression.py +34 -2
  19. pylegend/core/language/{operations → shared/operations}/boolean_operation_expressions.py +34 -6
  20. pylegend/core/language/{operations → shared/operations}/collection_operation_expressions.py +146 -26
  21. pylegend/core/language/{operations → shared/operations}/date_operation_expressions.py +164 -24
  22. pylegend/core/language/{operations → shared/operations}/float_operation_expressions.py +53 -8
  23. pylegend/core/language/{operations → shared/operations}/integer_operation_expressions.py +62 -9
  24. pylegend/core/language/{operations → shared/operations}/nullary_expression.py +9 -2
  25. pylegend/core/language/{operations → shared/operations}/number_operation_expressions.py +211 -30
  26. pylegend/core/language/{operations → shared/operations}/primitive_operation_expressions.py +42 -3
  27. pylegend/core/language/{operations → shared/operations}/string_operation_expressions.py +169 -21
  28. pylegend/core/language/{operations → shared/operations}/unary_expression.py +10 -2
  29. pylegend/core/language/{primitive_collection.py → shared/primitive_collection.py} +2 -2
  30. pylegend/core/language/{primitives → shared/primitives}/__init__.py +9 -9
  31. pylegend/core/language/{primitives → shared/primitives}/boolean.py +9 -5
  32. pylegend/core/language/{primitives → shared/primitives}/date.py +23 -15
  33. pylegend/core/language/{primitives → shared/primitives}/datetime.py +4 -5
  34. pylegend/core/language/{primitives → shared/primitives}/float.py +6 -6
  35. pylegend/core/language/{primitives → shared/primitives}/integer.py +6 -6
  36. pylegend/core/language/{primitives → shared/primitives}/number.py +16 -13
  37. pylegend/core/language/{primitives → shared/primitives}/primitive.py +25 -5
  38. pylegend/core/language/{primitives → shared/primitives}/strictdate.py +4 -5
  39. pylegend/core/language/{primitives → shared/primitives}/string.py +18 -19
  40. pylegend/core/language/{tds_row.py → shared/tds_row.py} +46 -16
  41. pylegend/core/request/__init__.py +8 -1
  42. pylegend/core/request/auth.py +89 -11
  43. pylegend/core/request/legend_client.py +32 -0
  44. pylegend/core/sql/metamodel_extension.py +16 -0
  45. pylegend/core/tds/abstract/__init__.py +13 -0
  46. pylegend/core/tds/abstract/frames/__init__.py +13 -0
  47. pylegend/core/tds/{legend_api/frames/legend_api_applied_function_tds_frame.py → abstract/frames/applied_function_tds_frame.py} +19 -13
  48. pylegend/core/tds/abstract/frames/base_tds_frame.py +125 -0
  49. pylegend/core/tds/{legend_api/frames/legend_api_input_tds_frame.py → abstract/frames/input_tds_frame.py} +9 -12
  50. pylegend/core/tds/{legend_api/frames/functions → abstract}/function_helpers.py +1 -1
  51. pylegend/core/tds/{legend_api/frames/functions/concatenate_function.py → legacy_api/frames/functions/legacy_api_concatenate_function.py} +25 -13
  52. pylegend/core/tds/{legend_api/frames/functions/distinct_function.py → legacy_api/frames/functions/legacy_api_distinct_function.py} +13 -8
  53. pylegend/core/tds/{legend_api/frames/functions/drop_function.py → legacy_api/frames/functions/legacy_api_drop_function.py} +13 -8
  54. pylegend/core/tds/{legend_api/frames/functions/extend_function.py → legacy_api/frames/functions/legacy_api_extend_function.py} +36 -16
  55. pylegend/core/tds/{legend_api/frames/functions/filter_function.py → legacy_api/frames/functions/legacy_api_filter_function.py} +25 -13
  56. pylegend/core/tds/{legend_api/frames/functions/group_by_function.py → legacy_api/frames/functions/legacy_api_group_by_function.py} +44 -17
  57. pylegend/core/tds/{legend_api/frames/functions/head_function.py → legacy_api/frames/functions/legacy_api_head_function.py} +13 -8
  58. 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
  59. pylegend/core/tds/{legend_api/frames/functions/join_function.py → legacy_api/frames/functions/legacy_api_join_function.py} +44 -20
  60. pylegend/core/tds/{legend_api/frames/functions/rename_columns_function.py → legacy_api/frames/functions/legacy_api_rename_columns_function.py} +20 -8
  61. pylegend/core/tds/{legend_api/frames/functions/restrict_function.py → legacy_api/frames/functions/legacy_api_restrict_function.py} +17 -8
  62. pylegend/core/tds/{legend_api/frames/functions/slice_function.py → legacy_api/frames/functions/legacy_api_slice_function.py} +13 -8
  63. pylegend/core/tds/{legend_api/frames/functions/sort_function.py → legacy_api/frames/functions/legacy_api_sort_function.py} +19 -8
  64. pylegend/core/tds/legacy_api/frames/legacy_api_applied_function_tds_frame.py +37 -0
  65. pylegend/core/tds/legacy_api/frames/legacy_api_base_tds_frame.py +204 -0
  66. pylegend/core/tds/legacy_api/frames/legacy_api_input_tds_frame.py +51 -0
  67. pylegend/core/tds/{legend_api/frames/legend_api_tds_frame.py → legacy_api/frames/legacy_api_tds_frame.py} +28 -28
  68. pylegend/core/tds/legendql_api/__init__.py +13 -0
  69. pylegend/core/tds/legendql_api/frames/__init__.py +13 -0
  70. pylegend/core/tds/legendql_api/frames/functions/__init__.py +13 -0
  71. pylegend/core/tds/legendql_api/frames/functions/legendql_api_asofjoin_function.py +156 -0
  72. pylegend/core/tds/legendql_api/frames/functions/legendql_api_concatenate_function.py +139 -0
  73. pylegend/core/tds/legendql_api/frames/functions/legendql_api_distinct_function.py +69 -0
  74. pylegend/core/tds/legendql_api/frames/functions/legendql_api_drop_function.py +74 -0
  75. pylegend/core/tds/legendql_api/frames/functions/legendql_api_extend_function.py +256 -0
  76. pylegend/core/tds/legendql_api/frames/functions/legendql_api_filter_function.py +121 -0
  77. pylegend/core/tds/legendql_api/frames/functions/legendql_api_function_helpers.py +137 -0
  78. pylegend/core/tds/legendql_api/frames/functions/legendql_api_groupby_function.py +256 -0
  79. pylegend/core/tds/legendql_api/frames/functions/legendql_api_head_function.py +74 -0
  80. pylegend/core/tds/legendql_api/frames/functions/legendql_api_join_function.py +214 -0
  81. pylegend/core/tds/legendql_api/frames/functions/legendql_api_project_function.py +169 -0
  82. pylegend/core/tds/legendql_api/frames/functions/legendql_api_rename_function.py +189 -0
  83. pylegend/core/tds/legendql_api/frames/functions/legendql_api_select_function.py +131 -0
  84. pylegend/core/tds/legendql_api/frames/functions/legendql_api_slice_function.py +82 -0
  85. pylegend/core/tds/legendql_api/frames/functions/legendql_api_sort_function.py +93 -0
  86. pylegend/core/tds/legendql_api/frames/functions/legendql_api_window_extend_function.py +283 -0
  87. pylegend/core/tds/legendql_api/frames/legendql_api_applied_function_tds_frame.py +37 -0
  88. pylegend/core/tds/legendql_api/frames/legendql_api_base_tds_frame.py +419 -0
  89. pylegend/core/tds/legendql_api/frames/legendql_api_input_tds_frame.py +50 -0
  90. pylegend/core/tds/legendql_api/frames/legendql_api_tds_frame.py +327 -0
  91. pylegend/core/tds/pandas_api/frames/functions/assign_function.py +6 -6
  92. pylegend/core/tds/pandas_api/frames/pandas_api_applied_function_tds_frame.py +4 -0
  93. pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py +11 -3
  94. pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py +2 -2
  95. pylegend/core/tds/tds_frame.py +32 -2
  96. pylegend/extensions/database/vendors/postgres/postgres_sql_to_string.py +1 -1
  97. pylegend/extensions/tds/abstract/legend_function_input_frame.py +4 -0
  98. pylegend/extensions/tds/abstract/legend_service_input_frame.py +4 -0
  99. pylegend/extensions/tds/abstract/table_spec_input_frame.py +4 -0
  100. 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
  101. 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
  102. 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
  103. pylegend/extensions/tds/legendql_api/__init__.py +13 -0
  104. pylegend/extensions/tds/legendql_api/frames/__init__.py +13 -0
  105. pylegend/extensions/tds/legendql_api/frames/legendql_api_legend_service_input_frame.py +46 -0
  106. pylegend/extensions/tds/legendql_api/frames/legendql_api_table_spec_input_frame.py +36 -0
  107. pylegend/{legend_api_tds_client.py → legacy_api_tds_client.py} +15 -15
  108. {pylegend-0.2.2.dist-info → pylegend-0.4.0.dist-info}/METADATA +7 -8
  109. pylegend-0.4.0.dist-info/NOTICE +5 -0
  110. pylegend-0.4.0.dist-info/RECORD +155 -0
  111. {pylegend-0.2.2.dist-info → pylegend-0.4.0.dist-info}/WHEEL +1 -1
  112. pylegend/core/tds/legend_api/frames/legend_api_base_tds_frame.py +0 -294
  113. pylegend-0.2.2.dist-info/RECORD +0 -115
  114. /pylegend/core/{databse → database}/__init__.py +0 -0
  115. /pylegend/core/{databse → database}/sql_to_string/config.py +0 -0
  116. /pylegend/core/language/{operations → shared/operations}/__init__.py +0 -0
  117. /pylegend/core/tds/{legend_api → legacy_api}/__init__.py +0 -0
  118. /pylegend/core/tds/{legend_api → legacy_api}/frames/__init__.py +0 -0
  119. /pylegend/core/tds/{legend_api → legacy_api}/frames/functions/__init__.py +0 -0
  120. /pylegend/extensions/tds/{legend_api → legacy_api}/__init__.py +0 -0
  121. /pylegend/extensions/tds/{legend_api → legacy_api}/frames/__init__.py +0 -0
  122. {pylegend-0.2.2.dist-info → pylegend-0.4.0.dist-info}/LICENSE +0 -0
  123. {pylegend-0.2.2.dist-info → pylegend-0.4.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
  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)