pylegend 0.12.0__py3-none-any.whl → 0.13.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 (25) hide show
  1. pylegend/core/database/sql_to_string/db_extension.py +177 -1
  2. pylegend/core/language/shared/expression.py +5 -0
  3. pylegend/core/language/shared/literal_expressions.py +22 -1
  4. pylegend/core/language/shared/operations/boolean_operation_expressions.py +144 -0
  5. pylegend/core/language/shared/operations/date_operation_expressions.py +91 -0
  6. pylegend/core/language/shared/operations/integer_operation_expressions.py +183 -1
  7. pylegend/core/language/shared/operations/string_operation_expressions.py +31 -1
  8. pylegend/core/language/shared/primitives/boolean.py +40 -0
  9. pylegend/core/language/shared/primitives/date.py +39 -0
  10. pylegend/core/language/shared/primitives/datetime.py +18 -0
  11. pylegend/core/language/shared/primitives/integer.py +54 -1
  12. pylegend/core/language/shared/primitives/strictdate.py +25 -1
  13. pylegend/core/language/shared/primitives/string.py +16 -2
  14. pylegend/core/sql/metamodel.py +50 -1
  15. pylegend/core/sql/metamodel_extension.py +77 -1
  16. pylegend/core/tds/pandas_api/frames/functions/iloc.py +99 -0
  17. pylegend/core/tds/pandas_api/frames/functions/loc.py +136 -0
  18. pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py +40 -0
  19. pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py +12 -0
  20. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/METADATA +1 -1
  21. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/RECORD +25 -23
  22. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/WHEEL +1 -1
  23. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/LICENSE +0 -0
  24. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/LICENSE.spdx +0 -0
  25. {pylegend-0.12.0.dist-info → pylegend-0.13.0.dist-info}/licenses/NOTICE +0 -0
@@ -20,6 +20,7 @@ from pylegend._typing import (
20
20
  from pylegend.core.sql.metamodel import (
21
21
  Expression,
22
22
  Window,
23
+ StringLiteral,
23
24
  )
24
25
 
25
26
  __all__: PyLegendSequence[str] = [
@@ -81,7 +82,12 @@ __all__: PyLegendSequence[str] = [
81
82
  "EpochExpression",
82
83
  "WindowExpression",
83
84
  "ConstantExpression",
84
- "StringSubStringExpression"
85
+ "StringSubStringExpression",
86
+ "DateAdjustExpression",
87
+ "BitwiseNotExpression",
88
+ "DateDiffExpression",
89
+ "DateTimeBucketExpression",
90
+ "DateType"
85
91
  ]
86
92
 
87
93
 
@@ -763,3 +769,73 @@ class StringSubStringExpression(Expression):
763
769
  self.value = value
764
770
  self.start = start
765
771
  self.end = end
772
+
773
+
774
+ class DateAdjustExpression(Expression):
775
+ date: "Expression"
776
+ number: "Expression"
777
+ duration_unit: "StringLiteral"
778
+
779
+ def __init__(
780
+ self,
781
+ date: "Expression",
782
+ number: "Expression",
783
+ duration_unit: "StringLiteral",
784
+ ) -> None:
785
+ super().__init__(_type="dateAdjustExpression")
786
+ self.date = date
787
+ self.number = number
788
+ self.duration_unit = duration_unit
789
+
790
+
791
+ class DateDiffExpression(Expression):
792
+ start_date: "Expression"
793
+ end_date: "Expression"
794
+ duration_unit: "StringLiteral"
795
+
796
+ def __init__(
797
+ self,
798
+ start_date: "Expression",
799
+ end_date: "Expression",
800
+ duration_unit: "StringLiteral",
801
+ ) -> None:
802
+ super().__init__(_type="dateDiffExpression")
803
+ self.start_date = start_date
804
+ self.end_date = end_date
805
+ self.duration_unit = duration_unit
806
+
807
+
808
+ class DateType(Enum):
809
+ DateTime = 1
810
+ StrictDate = 2
811
+
812
+
813
+ class DateTimeBucketExpression(Expression):
814
+ date: "Expression"
815
+ quantity: "Expression"
816
+ duration_unit: "StringLiteral"
817
+ date_type: DateType
818
+
819
+ def __init__(
820
+ self,
821
+ date: "Expression",
822
+ quantity: "Expression",
823
+ duration_unit: "StringLiteral",
824
+ date_type: DateType = DateType.DateTime,
825
+ ) -> None:
826
+ super().__init__(_type="dateTimeBucketExpression")
827
+ self.date = date
828
+ self.quantity = quantity
829
+ self.duration_unit = duration_unit
830
+ self.date_type = date_type
831
+
832
+
833
+ class BitwiseNotExpression(Expression):
834
+ value: "Expression"
835
+
836
+ def __init__(
837
+ self,
838
+ value: "Expression",
839
+ ) -> None:
840
+ super().__init__(_type="bitwiseNotExpression")
841
+ self.value = value
@@ -0,0 +1,99 @@
1
+ # Copyright 2026 Goldman Sachs
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import TYPE_CHECKING
16
+ from pylegend._typing import (
17
+ PyLegendUnion,
18
+ PyLegendTuple,
19
+ PyLegendSequence,
20
+ )
21
+
22
+ if TYPE_CHECKING:
23
+ from pylegend.core.tds.pandas_api.frames.pandas_api_base_tds_frame import PandasApiBaseTdsFrame
24
+ from pylegend.core.tds.pandas_api.frames.pandas_api_tds_frame import PandasApiTdsFrame
25
+
26
+
27
+ __all__: PyLegendSequence[str] = [
28
+ "PandasApiIlocIndexer"
29
+ ]
30
+
31
+
32
+ class PandasApiIlocIndexer:
33
+ _frame: "PandasApiBaseTdsFrame"
34
+
35
+ def __init__(self, frame: "PandasApiBaseTdsFrame") -> None:
36
+ self._frame = frame
37
+
38
+ def __getitem__( # type: ignore
39
+ self,
40
+ key: PyLegendUnion[int, slice, PyLegendTuple[PyLegendUnion[int, slice], ...]]
41
+ ) -> "PandasApiTdsFrame":
42
+ if isinstance(key, tuple):
43
+ if len(key) > 2:
44
+ raise IndexError("Too many indexers")
45
+ elif len(key) == 1:
46
+ rows, cols = key[0], slice(None, None, None)
47
+ else:
48
+ rows, cols = key # type: ignore
49
+ else:
50
+ rows, cols = key, slice(None, None, None)
51
+
52
+ # Row selection
53
+ row_frame = self._handle_row_selection(rows)
54
+
55
+ # Column selection
56
+ return self._handle_column_selection(row_frame, cols)
57
+
58
+ def _handle_row_selection(self, rows: PyLegendUnion[int, slice]) -> "PandasApiTdsFrame": # type: ignore
59
+ if isinstance(rows, slice):
60
+ if rows.step is not None and rows.step != 1:
61
+ raise NotImplementedError("iloc with slice step other than 1 is not supported yet in Pandas Api")
62
+
63
+ start = rows.start
64
+ stop = rows.stop
65
+ after = stop - 1 if stop is not None else None
66
+ return self._frame.truncate(before=start, after=after)
67
+
68
+ elif isinstance(rows, int):
69
+ return self._frame.truncate(before=rows, after=rows)
70
+
71
+ else:
72
+ raise NotImplementedError(
73
+ f"iloc supports integer, slice, or tuple of these, but got indexer of type: {type(rows)}"
74
+ )
75
+
76
+ def _handle_column_selection( # type: ignore
77
+ self,
78
+ frame: "PandasApiTdsFrame",
79
+ cols: PyLegendUnion[int, slice]
80
+ ) -> "PandasApiTdsFrame":
81
+ if isinstance(cols, slice):
82
+ if cols.step is not None and cols.step != 1:
83
+ raise NotImplementedError("iloc with slice step other than 1 is not supported yet in Pandas Api")
84
+
85
+ all_columns = [c.get_name() for c in frame.columns()]
86
+ selected_columns = all_columns[cols]
87
+ return frame.filter(items=selected_columns)
88
+
89
+ elif isinstance(cols, int):
90
+ all_columns = [c.get_name() for c in frame.columns()]
91
+ if not -len(all_columns) <= cols < len(all_columns):
92
+ raise IndexError("single positional indexer is out-of-bounds")
93
+ selected_column = all_columns[cols]
94
+ return frame.filter(items=[selected_column])
95
+
96
+ else:
97
+ raise NotImplementedError(
98
+ f"iloc supports integer, slice, or tuple of these, but got indexer of type: {type(cols)}"
99
+ )
@@ -0,0 +1,136 @@
1
+ # Copyright 2026 Goldman Sachs
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from typing import TYPE_CHECKING
16
+
17
+ import pandas as pd
18
+
19
+ from pylegend._typing import (
20
+ PyLegendUnion,
21
+ PyLegendSequence,
22
+ PyLegendTuple,
23
+ PyLegendCallable
24
+ )
25
+ from pylegend.core.language import PyLegendBoolean
26
+ from pylegend.core.tds.pandas_api.frames.functions.filtering import PandasApiFilteringFunction
27
+ from pylegend.core.tds.pandas_api.frames.pandas_api_applied_function_tds_frame import PandasApiAppliedFunctionTdsFrame
28
+
29
+ if TYPE_CHECKING:
30
+ from pylegend.core.tds.pandas_api.frames.pandas_api_base_tds_frame import PandasApiBaseTdsFrame
31
+ from pylegend.core.tds.pandas_api.frames.pandas_api_tds_frame import PandasApiTdsFrame
32
+
33
+ __all__: PyLegendSequence[str] = [
34
+ "PandasApiLocIndexer"
35
+ ]
36
+
37
+
38
+ class PandasApiLocIndexer:
39
+ _frame: "PandasApiBaseTdsFrame"
40
+
41
+ def __init__(self, frame: "PandasApiBaseTdsFrame") -> None:
42
+ self._frame = frame
43
+
44
+ def __getitem__( # type: ignore
45
+ self,
46
+ key: PyLegendUnion[
47
+ slice,
48
+ PyLegendBoolean,
49
+ PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean],
50
+ PyLegendTuple[
51
+ PyLegendUnion[slice, PyLegendBoolean, PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]],
52
+ PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]]
53
+ ]
54
+ ]
55
+ ) -> "PandasApiTdsFrame":
56
+ rows: PyLegendUnion[ # type: ignore
57
+ slice,
58
+ PyLegendBoolean,
59
+ PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]
60
+ ]
61
+ cols: PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]] # type: ignore
62
+
63
+ if isinstance(key, tuple):
64
+ if len(key) == 1:
65
+ rows, cols = key[0], slice(None, None, None)
66
+ elif len(key) == 2:
67
+ rows, cols = key[0], key[1]
68
+ else:
69
+ raise IndexError("Too many indexers")
70
+ else:
71
+ rows, cols = key, slice(None, None, None)
72
+
73
+ row_frame = self._handle_row_selection(rows)
74
+ return self._handle_column_selection(row_frame, cols)
75
+
76
+ def _handle_row_selection( # type: ignore
77
+ self,
78
+ rows: PyLegendUnion[slice, PyLegendBoolean, PyLegendCallable[["PandasApiBaseTdsFrame"], PyLegendBoolean]]
79
+ ) -> "PandasApiTdsFrame":
80
+ if isinstance(rows, slice):
81
+ if rows.start is None and rows.stop is None and rows.step is None:
82
+ return self._frame
83
+ else:
84
+ raise TypeError(
85
+ "loc supports only ':' for row slicing. "
86
+ "Label-based slicing for rows is not supported."
87
+ )
88
+
89
+ if isinstance(rows, PyLegendBoolean):
90
+ return PandasApiAppliedFunctionTdsFrame(
91
+ PandasApiFilteringFunction(self._frame, filter_expr=rows)
92
+ )
93
+
94
+ if callable(rows):
95
+ new_key = rows(self._frame)
96
+ return self._handle_row_selection(new_key)
97
+
98
+ raise TypeError(f"Unsupported key type for .loc row selection: {type(rows)}")
99
+
100
+ def _handle_column_selection( # type: ignore
101
+ self,
102
+ frame: "PandasApiTdsFrame",
103
+ cols: PyLegendUnion[str, slice, PyLegendSequence[str], PyLegendSequence[bool]]
104
+ ) -> "PandasApiTdsFrame":
105
+ if isinstance(cols, slice) and cols.start is None and cols.stop is None and cols.step is None:
106
+ return frame
107
+
108
+ if isinstance(cols, str):
109
+ return frame.filter(items=[cols])
110
+
111
+ if isinstance(cols, (list, tuple)):
112
+ all_columns = [c.get_name() for c in frame.columns()]
113
+ is_boolean_list = all(isinstance(k, bool) for k in cols)
114
+
115
+ if is_boolean_list:
116
+ if len(cols) != len(all_columns):
117
+ raise IndexError(f"Boolean index has wrong length: {len(cols)} instead of {len(all_columns)}")
118
+ selected_columns = [col for col, select in zip(all_columns, cols) if select]
119
+ return frame.filter(items=selected_columns)
120
+ else:
121
+ missing_cols = [c for c in cols if c not in all_columns]
122
+ if missing_cols:
123
+ raise KeyError(f"{missing_cols} not in index")
124
+ return frame.filter(items=cols) # type: ignore
125
+
126
+ if isinstance(cols, slice):
127
+ all_columns = [c.get_name() for c in frame.columns()]
128
+ pd_index = pd.Index(all_columns)
129
+
130
+ slicer = pd_index.slice_indexer(start=cols.start, end=cols.stop, step=cols.step)
131
+ selected_columns = pd_index[slicer].tolist()
132
+ if not selected_columns:
133
+ return frame.head(0)
134
+ return frame.filter(items=selected_columns)
135
+
136
+ raise TypeError(f"Unsupported key type for .loc column selection: {type(cols)}")
@@ -69,6 +69,8 @@ from pylegend.extensions.tds.result_handler import (
69
69
  if TYPE_CHECKING:
70
70
  from pylegend.core.language.pandas_api.pandas_api_series import Series
71
71
  from pylegend.core.tds.pandas_api.frames.pandas_api_groupby_tds_frame import PandasApiGroupbyTdsFrame
72
+ from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
73
+ from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
72
74
 
73
75
  __all__: PyLegendSequence[str] = [
74
76
  "PandasApiBaseTdsFrame"
@@ -675,6 +677,44 @@ class PandasApiBaseTdsFrame(PandasApiTdsFrame, BaseTdsFrame, metaclass=ABCMeta):
675
677
  AssignFunction(self, col_definitions=col_definitions) # type: ignore
676
678
  )
677
679
 
680
+ @property
681
+ def iloc(self) -> "PandasApiIlocIndexer":
682
+ """
683
+ Purely integer-location based indexing for selection by position.
684
+ .iloc[] is primarily integer position based (from 0 to length-1 of the axis).
685
+
686
+ Allowed inputs are:
687
+ - An integer, e.g. 5.
688
+ - A slice object with ints, e.g. 1:7.
689
+ - A tuple of row and column indexes, e.g., (slice(1, 5), slice(0, 2))
690
+
691
+ Other pandas iloc features such as list of integers, boolean arrays, and callables
692
+ are not supported and will raise a NotImplementedError.
693
+ """
694
+ from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
695
+ return PandasApiIlocIndexer(self)
696
+
697
+ @property
698
+ def loc(self) -> "PandasApiLocIndexer":
699
+ """
700
+ Access a group of rows and columns by label(s) or a boolean array.
701
+ .loc[] is primarily label based, but may also be used with a boolean array.
702
+
703
+ Allowed inputs are:
704
+ - A single label, e.g. 5 or 'a', (note that 5 is interpreted as a
705
+ label of the index, not as an integer position along the index).
706
+ - A list or array of labels, e.g. ['a', 'b', 'c'].
707
+ - A slice object with labels, e.g. 'a':'f'.
708
+ - A boolean array of the same length as the axis being sliced.
709
+ - A callable function with one argument (the calling Series or
710
+ DataFrame) and that returns valid output for indexing (one of the above).
711
+
712
+ Currently, for row selection, only callable function or complete slice are supported.
713
+ For column selection, string labels, lists of string labels, and slices of string labels are supported.
714
+ """
715
+ from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
716
+ return PandasApiLocIndexer(self)
717
+
678
718
  def head(self, n: int = 5) -> "PandasApiTdsFrame":
679
719
  """
680
720
  Return the first `n` rows by calling truncate on rows.
@@ -47,6 +47,8 @@ from pylegend.core.tds.tds_frame import PyLegendTdsFrame
47
47
  if TYPE_CHECKING:
48
48
  from pylegend.core.language.pandas_api.pandas_api_series import Series
49
49
  from pylegend.core.tds.pandas_api.frames.pandas_api_groupby_tds_frame import PandasApiGroupbyTdsFrame
50
+ from pylegend.core.tds.pandas_api.frames.functions.iloc import PandasApiIlocIndexer
51
+ from pylegend.core.tds.pandas_api.frames.functions.loc import PandasApiLocIndexer
50
52
 
51
53
  __all__: PyLegendSequence[str] = [
52
54
  "PandasApiTdsFrame"
@@ -301,6 +303,16 @@ class PandasApiTdsFrame(PyLegendTdsFrame):
301
303
  ) -> "PandasApiTdsFrame":
302
304
  pass # pragma: no cover
303
305
 
306
+ @property
307
+ @abstractmethod
308
+ def iloc(self) -> "PandasApiIlocIndexer":
309
+ pass # pragma: no cover
310
+
311
+ @property
312
+ @abstractmethod
313
+ def loc(self) -> "PandasApiLocIndexer":
314
+ pass # pragma: no cover
315
+
304
316
  @abstractmethod
305
317
  def head(self, n: int = 5) -> "PandasApiTdsFrame":
306
318
  pass # pragma: no cover
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pylegend
3
- Version: 0.12.0
3
+ Version: 0.13.0
4
4
  Summary: Python language binding for Legend data management platform
5
5
  License: Apache-2.0
6
6
  License-File: LICENSE
@@ -4,7 +4,7 @@ pylegend/core/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
4
4
  pylegend/core/database/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
5
5
  pylegend/core/database/sql_to_string/__init__.py,sha256=_qWOoReR9ygprnShQRBtp4wFmqtiPEa88jAhOZpYY2c,1028
6
6
  pylegend/core/database/sql_to_string/config.py,sha256=xrwPFcuZyzZcKNGeOQTnFW2y7CqhT6laSAazVl93JLU,1384
7
- pylegend/core/database/sql_to_string/db_extension.py,sha256=o-hwigD4SCqibcJ0roVfwDPDavyr8IqVNBrvxjg-zLo,55897
7
+ pylegend/core/database/sql_to_string/db_extension.py,sha256=Mt1uCgub9ChjF2k151Ybthr_KO0VoyrqULYPAlkpZA0,62530
8
8
  pylegend/core/database/sql_to_string/generator.py,sha256=xk3siXWyR7_ahn6pwsUMi80V_7NV2tYa7x5dosiNJR4,2607
9
9
  pylegend/core/language/__init__.py,sha256=sw70dEA5RT660Qmpjxdi1XKEWDwshuedomqHhyIJpvI,4331
10
10
  pylegend/core/language/legacy_api/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
@@ -20,35 +20,35 @@ pylegend/core/language/pandas_api/pandas_api_series.py,sha256=WJ--FaWeODIvS26REr
20
20
  pylegend/core/language/pandas_api/pandas_api_tds_row.py,sha256=L0O5BLok3KqmzUgXFfM2fQgrpAxCfQ74bOplnetjyvw,2516
21
21
  pylegend/core/language/shared/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
22
22
  pylegend/core/language/shared/column_expressions.py,sha256=qWHVvwPGwKroQX94a_ovUrxCPnosVMX3tBWlTj7uJ6k,4333
23
- pylegend/core/language/shared/expression.py,sha256=-XDJ3JfkyQ2FunACUEGI4CeTgqCvBexp55_YCaZUD1k,2446
23
+ pylegend/core/language/shared/expression.py,sha256=SvLI6GxzvjSpy21NIB4ZyPLKGIR7y9CN5lV-I5zGklw,2567
24
24
  pylegend/core/language/shared/functions.py,sha256=HT1Qp5pLV3a24aItXqBnGfKT54f6Uw_pu5oGSzWTGL4,1749
25
25
  pylegend/core/language/shared/helpers.py,sha256=E7IKZwb__qj4_JpoBT2cra_umvfKP58c5U5bygMqh_o,2379
26
- pylegend/core/language/shared/literal_expressions.py,sha256=YfLdbhkN5RZm_NRaseWngoZ7iSEbe42FuF2criZVYD8,6295
26
+ pylegend/core/language/shared/literal_expressions.py,sha256=DqbHBOTMYD0PDXdZzuAOVXNfeMnqaEWFEHvgeDzZsF8,6877
27
27
  pylegend/core/language/shared/operations/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
28
28
  pylegend/core/language/shared/operations/binary_expression.py,sha256=I3CIWwbKlKq1R8ekUXY8QKyHro8b7fIgeM8hTPwN5jA,4006
29
- pylegend/core/language/shared/operations/boolean_operation_expressions.py,sha256=6NYAilcC6QEn4J_mWTZdDCJhbPMam36Xl6Ai9N1kJsQ,4630
29
+ pylegend/core/language/shared/operations/boolean_operation_expressions.py,sha256=jOs_b-Clt4Jij9Z-Xt1YLQ-xaDmZGosfRRzSiRvtgJk,10309
30
30
  pylegend/core/language/shared/operations/collection_operation_expressions.py,sha256=PuyICSjPadQNWkp8aZnCZblRnG_uh7lPEXMDN9nwKRI,22412
31
- pylegend/core/language/shared/operations/date_operation_expressions.py,sha256=NFgOjS2GyviFIq2eR7wT1niO2NIGr8FeeYNIhmDjig0,27905
31
+ pylegend/core/language/shared/operations/date_operation_expressions.py,sha256=CiWBJIyyMu-u7c3Ho-wOCjcqzpm5hvyYthS7F8udsg8,31507
32
32
  pylegend/core/language/shared/operations/float_operation_expressions.py,sha256=GsKflYlswzfvb2eEqObRgcoO218zdNj3atS-5g8YzJI,6849
33
- pylegend/core/language/shared/operations/integer_operation_expressions.py,sha256=eWayMDrYjmoD1RbMjTf2WRWV2m2ZefpqNKYoFLl1cmQ,9524
33
+ pylegend/core/language/shared/operations/integer_operation_expressions.py,sha256=VsI5pQEya_XWmAvmRvmr97HJB_R2XZSJS6qypE-NBEI,16817
34
34
  pylegend/core/language/shared/operations/nary_expression.py,sha256=GXqsmpR_Jb_SothvIXWeQ6lJp03SKwEA2zqL-JomlNc,3663
35
35
  pylegend/core/language/shared/operations/nullary_expression.py,sha256=dMq3hi7_t0TFboOoQQHjuNZ7D9hLYfc_NozNaUCJTtI,2242
36
36
  pylegend/core/language/shared/operations/number_operation_expressions.py,sha256=EK0_T0_AY2bBK-A4yXoHmDsXTnshVP6lz_JLPl4w7Ds,39376
37
37
  pylegend/core/language/shared/operations/primitive_operation_expressions.py,sha256=BdnxYxD0qnBzKppA9GJC1V9FDhGjyh1uuauRX8UObx0,6365
38
- pylegend/core/language/shared/operations/string_operation_expressions.py,sha256=BId4aquXndVmEDxJ_jwApGX07KPRkB_VIKPNjRyVBy4,44427
38
+ pylegend/core/language/shared/operations/string_operation_expressions.py,sha256=-HNYQTdA8L9D3-FXztqGsvK3JQ2konMwkGyvFyRjpcE,45507
39
39
  pylegend/core/language/shared/operations/unary_expression.py,sha256=1VWE43rN4x4NLc6aL3xRzleK9c_UfrLawlyYgX3SG48,3132
40
40
  pylegend/core/language/shared/pct_helpers.py,sha256=tQo0BkaPro8Tqc3Tt2hmMrQOLsf4Ra0ENgDRQOhZe1I,1998
41
41
  pylegend/core/language/shared/primitive_collection.py,sha256=ShUtgdZkZ8cKdQJLP5iU_zYDK7piMzWlimvjhnyfnGk,13098
42
42
  pylegend/core/language/shared/primitives/__init__.py,sha256=9p7VVRhzeRQwTkxXQBBZuJY6P9V-yX0Q_elviaYIgPg,1649
43
- pylegend/core/language/shared/primitives/boolean.py,sha256=x0JgS8E9AXv0fkExuCCyD9Paim2xwfU9cn-1Jh3bqtI,4058
44
- pylegend/core/language/shared/primitives/date.py,sha256=CFiz6LquJIUHBIdHGZ5j16wYcw-Bo4nYHeM7Hne1EWI,9062
45
- pylegend/core/language/shared/primitives/datetime.py,sha256=F8m-pLm_VcefI-_iF8CCjbi-AZKzrXxqyuXZtxJB_AU,2495
43
+ pylegend/core/language/shared/primitives/boolean.py,sha256=94HG7VxSBOD20xYyLZT314c8s7yuMwmERIf2CxokBr0,6127
44
+ pylegend/core/language/shared/primitives/date.py,sha256=_qYAqIiTGv6Pr-Xcd2JznKUQ0lRGvicAHuylgmhrCck,11249
45
+ pylegend/core/language/shared/primitives/datetime.py,sha256=HnmsRM1kgwVHtiqiPWIV9ecyo_7m7l9Ps8GKvZqBf1A,3464
46
46
  pylegend/core/language/shared/primitives/float.py,sha256=LpD3nWogv8aT6RECgI7rVmsRPY4ji96JCXdTEAr2EAg,6146
47
- pylegend/core/language/shared/primitives/integer.py,sha256=SFG0oDfk9Uewk2Ek9rfbqkubJM6646_qpSfe3L6Jr0M,7651
47
+ pylegend/core/language/shared/primitives/integer.py,sha256=OxLTeJhlkwWY7KQN8ofpkUEP-9XZtKmmAmwIxhz7Mqo,10631
48
48
  pylegend/core/language/shared/primitives/number.py,sha256=aktoWf4sgc8evO8f9cUYbPVPjHeppKzJ_Jw_wIUakUE,14816
49
49
  pylegend/core/language/shared/primitives/primitive.py,sha256=ARWpw7AXxg55ni7yGRYCO6JKxzgJnME_ZZcKyD-J5qo,4815
50
- pylegend/core/language/shared/primitives/strictdate.py,sha256=FidyUqdWTaOrk6tomYHQvhfnGW--zVTt9ldIgGxJk5M,2503
51
- pylegend/core/language/shared/primitives/string.py,sha256=03iZG_YvlUYAdM0Njg5lugp_k3v5NhnqkVi8RBKzJVk,16197
50
+ pylegend/core/language/shared/primitives/strictdate.py,sha256=AXcH9fuWYVe4YO2KCnn2heUTaQ4y6pUM4ulGGLbTpow,3789
51
+ pylegend/core/language/shared/primitives/string.py,sha256=bc0NYsd0oRMfA8w-2PSCO1ATiiIo2yV_hxv7-yOBtGs,16803
52
52
  pylegend/core/language/shared/tds_row.py,sha256=23sxVfa74T-TlfAs1CgvwjhV26b-FyZ72yGy9BqP7CE,9027
53
53
  pylegend/core/project_cooridnates.py,sha256=t1G6gJzcRQRbCjGpCOk0vBiqd0F8Y_e15Nu4NuzYd6I,3751
54
54
  pylegend/core/request/__init__.py,sha256=6jQTL8B8Sd1rsCXHr4dZ398OrvROoGI6Y_aAI_FOfiI,1082
@@ -57,8 +57,8 @@ pylegend/core/request/legend_client.py,sha256=PLCCiazvFG2ujcHN-vGDQxpEl5QvFHBNNc
57
57
  pylegend/core/request/response_reader.py,sha256=TNMi2GKk4lkmf7VMeY5n2AwhxxuWbX4M8pgC2_pXFbE,1691
58
58
  pylegend/core/request/service_client.py,sha256=oNvMR6qNl5UcxpcAjIb4CCpd0MB3Z-Y5OJSyFPGeerM,3377
59
59
  pylegend/core/sql/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
60
- pylegend/core/sql/metamodel.py,sha256=UNGJ9mZWw7sJQzNwXsZjZtrASTBfPrM2Un8-BEd8jDg,20330
61
- pylegend/core/sql/metamodel_extension.py,sha256=5y63ms2MLdfW07X6R5hsozinWEr7LoB_lGXvROP4byk,16382
60
+ pylegend/core/sql/metamodel.py,sha256=VHJ2C0MVUgWH5k3DF2b2_LJNvK_24MbhefbWHu9v2dQ,21464
61
+ pylegend/core/sql/metamodel_extension.py,sha256=Cwqqzh7do4uPaBb_7xLZFq-3Oh3AtywwHM-OqATYs4Y,18297
62
62
  pylegend/core/tds/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
63
63
  pylegend/core/tds/abstract/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
64
64
  pylegend/core/tds/abstract/frames/__init__.py,sha256=g6w4WCuQ2pqQG6yyn-QLLXED3ttOOB8YnXzVt3ijb28,578
@@ -119,15 +119,17 @@ pylegend/core/tds/pandas_api/frames/functions/dropna.py,sha256=OVVwUsPSAykm1g-af
119
119
  pylegend/core/tds/pandas_api/frames/functions/fillna.py,sha256=7XKfIpRlTtoIS1jzfPemOMuytH4njqQ_4GF2UKZliG0,6553
120
120
  pylegend/core/tds/pandas_api/frames/functions/filter.py,sha256=TE-OfQqOrBwhS7bKDChsLRTAWOZreZikGQhQPByy8uA,7959
121
121
  pylegend/core/tds/pandas_api/frames/functions/filtering.py,sha256=FmzzobMoL-_mt3uFssveGTNCVGo6ZfttXZsj1c56uIo,3181
122
+ pylegend/core/tds/pandas_api/frames/functions/iloc.py,sha256=PEgqcQKyPATh1y1dEIrsVjsc7jUXdZPyE7Z2bAE6bDM,3698
123
+ pylegend/core/tds/pandas_api/frames/functions/loc.py,sha256=ZI0NGcPrDf0XHcf95ow-HHIwZslMAJXk5O7HDssckec,5418
122
124
  pylegend/core/tds/pandas_api/frames/functions/merge.py,sha256=bp9a9reNtUAKqaz1Kft3m7wegHKxOmIVoJH135A1iV0,21225
123
125
  pylegend/core/tds/pandas_api/frames/functions/rename.py,sha256=afXj8EhsTVUNJAZDFAM_K3VOX5oH3TA2FxSDoZHfT6M,8898
124
126
  pylegend/core/tds/pandas_api/frames/functions/sort_values_function.py,sha256=sppDTCW3X0RXLYD2zBvjKEObtc_JfEtoNY7lj-60zqQ,7132
125
127
  pylegend/core/tds/pandas_api/frames/functions/truncate_function.py,sha256=VUr9jzVhnU_mJVootUQfcEG8Q66vSJba1QGUGQiYxCk,6214
126
128
  pylegend/core/tds/pandas_api/frames/pandas_api_applied_function_tds_frame.py,sha256=u2ONcOw9kP1JJxl2VZH_fKIaqdyY0n9nuIy_p-yQ93g,2967
127
- pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py,sha256=HBmAuI2VW6Fc67CzJ3vJV_OcEP0lYCDKJjVYB89ObBk,36833
129
+ pylegend/core/tds/pandas_api/frames/pandas_api_base_tds_frame.py,sha256=TnbFtyKwMK261MfWPVC591X4m1xu37xLOd68tvcHnwI,38820
128
130
  pylegend/core/tds/pandas_api/frames/pandas_api_groupby_tds_frame.py,sha256=0K4Hb3FPs7ZzlZCWFG-65ZKkqEvHHj_FvE26g9rz7ps,13714
129
131
  pylegend/core/tds/pandas_api/frames/pandas_api_input_tds_frame.py,sha256=FgwIJCkawXuIjXYfVVrLa5RHfOO5xnSFI0pXti34L_8,2116
130
- pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py,sha256=QYRFRJ605cpb4en2r048EFyoPsl8ieymjChGQr87oz0,11833
132
+ pylegend/core/tds/pandas_api/frames/pandas_api_tds_frame.py,sha256=vPPtO_zvElaZfa4kgUEOIMnBMe133TNqTGE2DDDyC3M,12233
131
133
  pylegend/core/tds/result_handler/__init__.py,sha256=8RE84xfkARwDbaQCvZulXcvDJlI-V5DuJp9RsdaGnqU,1141
132
134
  pylegend/core/tds/result_handler/result_handler.py,sha256=7tSzOswFCapAAdACphIR3Q0QISYyjo_On_vtsUIPAbA,1183
133
135
  pylegend/core/tds/result_handler/to_csv_file_result_handler.py,sha256=lm0UG87RNUXqQwOtSgxHbLKzAHebNuE3zIXM3ErtOxM,2270
@@ -169,9 +171,9 @@ pylegend/legacy_api_tds_client.py,sha256=IXfo2pdBFV3M3S4RYKJcvudMc_OGdR0yvJhTV-o
169
171
  pylegend/legendql_api_tds_client.py,sha256=oS6NET5pAA-hfVhVvwG6sRF7omyBs_gEYSAgA8Tky8U,2357
170
172
  pylegend/utils/__init__.py,sha256=LXTDJSDmHQXtnMDZouhZp9IZQVpY6ONkINbUYjtnMkE,578
171
173
  pylegend/utils/class_utils.py,sha256=t4PpF3jAXS_D6p9TqlSppryNYNOuy5C-kbKn2Kgb4QU,973
172
- pylegend-0.12.0.dist-info/METADATA,sha256=YEOJdVd5mlhj77NLk1oUZWflNte8um_E9OvDE9wYbTc,4281
173
- pylegend-0.12.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
174
- pylegend-0.12.0.dist-info/licenses/LICENSE,sha256=AGR96_qQPZO66Gjqq4G6r_g670K35VtW-IobTAkmZJM,11343
175
- pylegend-0.12.0.dist-info/licenses/LICENSE.spdx,sha256=i7TsBclLotUvMjx9vZ_6S8Pp0r4uknWGw1RwiKBBvQ4,207
176
- pylegend-0.12.0.dist-info/licenses/NOTICE,sha256=2Lr4FqiscyRI7-vyn7c2z-zqUw2p6x7upJyBvFKkHjk,167
177
- pylegend-0.12.0.dist-info/RECORD,,
174
+ pylegend-0.13.0.dist-info/METADATA,sha256=AbsE8ssm_7IVkGAoMIkAEv7yHKYsQvNqjnGEy30z7xU,4281
175
+ pylegend-0.13.0.dist-info/WHEEL,sha256=3ny-bZhpXrU6vSQ1UPG34FoxZBp3lVcvK0LkgUz6VLk,88
176
+ pylegend-0.13.0.dist-info/licenses/LICENSE,sha256=AGR96_qQPZO66Gjqq4G6r_g670K35VtW-IobTAkmZJM,11343
177
+ pylegend-0.13.0.dist-info/licenses/LICENSE.spdx,sha256=i7TsBclLotUvMjx9vZ_6S8Pp0r4uknWGw1RwiKBBvQ4,207
178
+ pylegend-0.13.0.dist-info/licenses/NOTICE,sha256=2Lr4FqiscyRI7-vyn7c2z-zqUw2p6x7upJyBvFKkHjk,167
179
+ pylegend-0.13.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: poetry-core 2.2.1
2
+ Generator: poetry-core 2.3.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any