sqlframe 3.13.1__py3-none-any.whl → 3.13.3__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.
sqlframe/_version.py CHANGED
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '3.13.1'
16
- __version_tuple__ = version_tuple = (3, 13, 1)
15
+ __version__ = version = '3.13.3'
16
+ __version_tuple__ = version_tuple = (3, 13, 3)
@@ -202,6 +202,7 @@ class BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
202
202
  _na: t.Type[NA]
203
203
  _stat: t.Type[STAT]
204
204
  _group_data: t.Type[GROUP_DATA]
205
+ _EXPLAIN_PREFIX = "EXPLAIN"
205
206
 
206
207
  def __init__(
207
208
  self,
@@ -1144,6 +1145,18 @@ class BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
1144
1145
  final_df = filtered_df.select(*all_columns)
1145
1146
  return final_df
1146
1147
 
1148
+ def _get_explain_plan_rows(self) -> t.List[Row]:
1149
+ sql_queries = self.sql(
1150
+ pretty=False, optimize=False, as_list=True, dialect=self.session.execution_dialect
1151
+ )
1152
+ if len(sql_queries) > 1:
1153
+ raise ValueError("Cannot explain a DataFrame with multiple queries")
1154
+ sql_query = " ".join([self._EXPLAIN_PREFIX, sql_queries[0]])
1155
+ results = self.session._collect(sql_query)
1156
+ if len(results) != 1:
1157
+ raise ValueError("Got more than one result from explain query")
1158
+ return results
1159
+
1147
1160
  def explain(
1148
1161
  self, extended: t.Optional[t.Union[bool, str]] = None, mode: t.Optional[str] = None
1149
1162
  ) -> None:
@@ -1212,11 +1225,8 @@ class BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
1212
1225
  ...Statistics...
1213
1226
  ...
1214
1227
  """
1215
- sql_queries = self.sql(pretty=False, optimize=False, as_list=True)
1216
- if len(sql_queries) > 1:
1217
- raise ValueError("Cannot explain a DataFrame with multiple queries")
1218
- sql_query = "EXPLAIN " + sql_queries[0]
1219
- self.session._execute(sql_query)
1228
+ results = self._get_explain_plan_rows()
1229
+ print(results[0][0])
1220
1230
 
1221
1231
  @operation(Operation.FROM)
1222
1232
  def fillna(
sqlframe/base/session.py CHANGED
@@ -548,7 +548,7 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN, UDF_REGISTRATION
548
548
  normalize_identifiers(expression, dialect=dialect)
549
549
  if quote_identifiers:
550
550
  quote_identifiers_func(expression, dialect=dialect)
551
- return optimize(expression, dialect=dialect, schema=self.catalog._schema)
551
+ return optimize(expression, dialect=dialect, schema=self.catalog._schema, infer_schema=True)
552
552
 
553
553
  def _execute(self, sql: str) -> None:
554
554
  self._cur.execute(sql)
@@ -72,3 +72,8 @@ class BigQueryDataFrame(
72
72
  sql = self.session._to_sql(self.expression)
73
73
  query_job = self.session._client.query(sql, job_config=job_config)
74
74
  return [field_to_column(field) for field in query_job.schema]
75
+
76
+ def explain(
77
+ self, extended: t.Optional[t.Union[bool, str]] = None, mode: t.Optional[str] = None
78
+ ) -> None:
79
+ raise NotImplementedError("BigQuery does not support EXPLAIN")
@@ -46,6 +46,12 @@ class DuckDBDataFrame(
46
46
  _stat = DuckDBDataFrameStatFunctions
47
47
  _group_data = DuckDBGroupedData
48
48
 
49
+ def explain(
50
+ self, extended: t.Optional[t.Union[bool, str]] = None, mode: t.Optional[str] = None
51
+ ) -> None:
52
+ results = self._get_explain_plan_rows()
53
+ print(results[0][1])
54
+
49
55
  @t.overload
50
56
  def toArrow(self) -> ArrowTable: ...
51
57
 
@@ -43,6 +43,7 @@ class SnowflakeDataFrame(
43
43
  _na = SnowflakeDataFrameNaFunctions
44
44
  _stat = SnowflakeDataFrameStatFunctions
45
45
  _group_data = SnowflakeGroupedData
46
+ _EXPLAIN_PREFIX = "EXPLAIN USING TEXT"
46
47
 
47
48
  @property
48
49
  def _typed_columns(self) -> t.List[CatalogColumn]:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.13.1
3
+ Version: 3.13.3
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -17,7 +17,7 @@ Requires-Python: >=3.9
17
17
  Description-Content-Type: text/markdown
18
18
  License-File: LICENSE
19
19
  Requires-Dist: prettytable <4
20
- Requires-Dist: sqlglot <26.1,>=24.0.0
20
+ Requires-Dist: sqlglot <26.3,>=24.0.0
21
21
  Requires-Dist: typing-extensions
22
22
  Provides-Extra: bigquery
23
23
  Requires-Dist: google-cloud-bigquery-storage <3,>=2 ; extra == 'bigquery'
@@ -33,7 +33,7 @@ Requires-Dist: pandas-stubs <3,>=2 ; extra == 'dev'
33
33
  Requires-Dist: pandas <3,>=2 ; extra == 'dev'
34
34
  Requires-Dist: pre-commit <5,>=3.7 ; extra == 'dev'
35
35
  Requires-Dist: psycopg <4,>=3.1 ; extra == 'dev'
36
- Requires-Dist: pyarrow <19,>=10 ; extra == 'dev'
36
+ Requires-Dist: pyarrow <20,>=10 ; extra == 'dev'
37
37
  Requires-Dist: pyspark <3.6,>=2 ; extra == 'dev'
38
38
  Requires-Dist: pytest-forked ; extra == 'dev'
39
39
  Requires-Dist: pytest-postgresql <7,>=6 ; extra == 'dev'
@@ -1,10 +1,10 @@
1
1
  sqlframe/__init__.py,sha256=wfqm98eLoLid9oV_FzzpG5loKC6LxOhj2lXpfN7SARo,3138
2
- sqlframe/_version.py,sha256=fmajg3X8ZdOn-UpUewARwK5cfYf4wP4Xa0DcHjigFYo,413
2
+ sqlframe/_version.py,sha256=_uZxcbQuQ0yJZqsBIcuycE0BUozIDNCyjFPeAZ7W1Ek,413
3
3
  sqlframe/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
4
  sqlframe/base/_typing.py,sha256=b2clI5HI1zEZKB_3Msx3FeAJQyft44ubUifJwQRVXyQ,1298
5
5
  sqlframe/base/catalog.py,sha256=SzFQalTWdhWzxUY-4ut1f9TfOECp_JmJEgNPfrRKCe0,38457
6
6
  sqlframe/base/column.py,sha256=wRghgieYAA51aw4WuFQWOvl0TFOToZbBhBuIamEzxx4,18011
7
- sqlframe/base/dataframe.py,sha256=skfzyQt8e5_QOtZ3EHzPd5RqnDbQI7HJDk9VPyQk5gI,74555
7
+ sqlframe/base/dataframe.py,sha256=bnF8SYIDhSFPYKchGakRG_oWqgZ-66jKZsdcqUSqCDE,74940
8
8
  sqlframe/base/decorators.py,sha256=P56cgs8DANxGRIwVs5uOMnDy-BlXZZYMbf4fdnkpWPI,1889
9
9
  sqlframe/base/exceptions.py,sha256=9Uwvqn2eAkDpqm4BrRgbL61qM-GMCbJEMAW8otxO46s,370
10
10
  sqlframe/base/function_alternatives.py,sha256=8kDCh1cOXtdCcBPYBQ8byXxRAZvphS9N8GDs4txBzGg,52544
@@ -13,7 +13,7 @@ sqlframe/base/group.py,sha256=fsyG5990_Pd7gFPjTFrH9IEoAquL_wEkVpIlBAIkZJU,4091
13
13
  sqlframe/base/normalize.py,sha256=nXAJ5CwxVf4DV0GsH-q1w0p8gmjSMlv96k_ez1eVul8,3880
14
14
  sqlframe/base/operations.py,sha256=xSPw74e59wYvNd6U1AlwziNCTG6Aftrbl4SybN9u9VE,3450
15
15
  sqlframe/base/readerwriter.py,sha256=9cgOZuB3phZbQufY98JRDBVWRww3hsULc6Or1HK2Onk,26554
16
- sqlframe/base/session.py,sha256=R3APQhEZ_FH-tOBMdCu6zjWxGQG5w2qLpXBjpo25Gt0,25941
16
+ sqlframe/base/session.py,sha256=a4F4ql7nyXJYUbrrKFdoVtnyCyri-ji0pvSn53Uevpk,25960
17
17
  sqlframe/base/transforms.py,sha256=y0j3SGDz3XCmNGrvassk1S-owllUWfkHyMgZlY6SFO4,467
18
18
  sqlframe/base/types.py,sha256=iBNk9bpFtb2NBIogYS8i7OlQZMRvpR6XxqzBebsjQDU,12280
19
19
  sqlframe/base/udf.py,sha256=O6hMhBUy9NVv-mhJRtfFhXTIa_-Z8Y_FkmmuOHu0l90,1117
@@ -26,7 +26,7 @@ sqlframe/base/mixins/readwriter_mixins.py,sha256=ap8j_g7PoUGHaHKCPMnRPbXofOsUhUz
26
26
  sqlframe/bigquery/__init__.py,sha256=kbaomhYAANPdxeDQhajv8IHfMg_ENKivtYK-rPwaV08,939
27
27
  sqlframe/bigquery/catalog.py,sha256=8d36IzT5GPWd1FdxJ9vEljOdbIDepHnFOBjwP0bX6FE,11625
28
28
  sqlframe/bigquery/column.py,sha256=E1tUa62Y5HajkhgFuebU9zohrGyieudcHzTT8gfalio,40
29
- sqlframe/bigquery/dataframe.py,sha256=O7qkwVRuuyqdesfwjXLBMgScQqUugPIYklboQ2vgRyE,2403
29
+ sqlframe/bigquery/dataframe.py,sha256=2qlnwTOpfpHQxr9MCxeZWxKiQoL6txEgGNE8JQsalUQ,2599
30
30
  sqlframe/bigquery/functions.py,sha256=MYLs6-sXXqe5o6ghJHHtEpFJlYMeyKzx9-rT3wwXlc4,426
31
31
  sqlframe/bigquery/functions.pyi,sha256=KXgV46eZFNIXwXIhPuSJ08BG18iLQzDCQjyI3REBEXg,11925
32
32
  sqlframe/bigquery/group.py,sha256=UVBNBRTo8OqS-_cS5YwvTeJYgYxeG-d6R3kfyHmlFqw,391
@@ -50,7 +50,7 @@ sqlframe/databricks/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0
50
50
  sqlframe/duckdb/__init__.py,sha256=KAw_uZEhFMwi3D9Wj6AgHAKqLNk-EAx2uDIYu56oL44,872
51
51
  sqlframe/duckdb/catalog.py,sha256=YYYVmetLUaJOdObKw4AJ7L0P-msshkta4xHlcZQ9zEA,4795
52
52
  sqlframe/duckdb/column.py,sha256=E1tUa62Y5HajkhgFuebU9zohrGyieudcHzTT8gfalio,40
53
- sqlframe/duckdb/dataframe.py,sha256=OgU4zySAKqz7XhwOhNJuUkwkflU67UvyqV3IbvaFVo4,1706
53
+ sqlframe/duckdb/dataframe.py,sha256=Z8_K69UQGZVeBfVGXVwIJP8OMuIvNBB3DPKTP3Lfu4w,1908
54
54
  sqlframe/duckdb/functions.py,sha256=ix2efGGD4HLaY1rtCtEd3IrsicGEVGiBAeKOo5OD8rA,424
55
55
  sqlframe/duckdb/functions.pyi,sha256=P0ky6k-J7LdCDrQ0OjfRC3ARIYNHPmAmmaB_jBEO5L0,12383
56
56
  sqlframe/duckdb/group.py,sha256=IkhbW42Ng1U5YT3FkIdiB4zBqRkW4QyTb-1detY1e_4,383
@@ -85,7 +85,7 @@ sqlframe/redshift/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,3
85
85
  sqlframe/snowflake/__init__.py,sha256=msYAxOnPyjuBSTbpb5s9P5o0pr2N82UUGPxUtv0TNNw,966
86
86
  sqlframe/snowflake/catalog.py,sha256=Tp_B9oMTInnqLTiZNsT0UNc-a-aKXu3zFThlCwLeKCA,6507
87
87
  sqlframe/snowflake/column.py,sha256=E1tUa62Y5HajkhgFuebU9zohrGyieudcHzTT8gfalio,40
88
- sqlframe/snowflake/dataframe.py,sha256=X3FOasXh12OPFGF5-YYy1ThxIEdDwqc1xf3hdmuViN0,2142
88
+ sqlframe/snowflake/dataframe.py,sha256=TosBO9tnnqAQ9Y-abX954vQM8VBLYRmN_P50iusMFgQ,2185
89
89
  sqlframe/snowflake/functions.py,sha256=g3ELesLGvN7tyRyiEAnPneVyL0rQhSSOxYFvBFuOiaM,391
90
90
  sqlframe/snowflake/functions.pyi,sha256=sEqNdyqQBtgqoKtRViUb70QT5yrvpVoP3ZN7VxHNxbw,12612
91
91
  sqlframe/snowflake/group.py,sha256=pPP1l2RRo_LgkXrji8a87n2PKo-63ZRPT-WUtvVcBME,395
@@ -119,8 +119,8 @@ sqlframe/standalone/udf.py,sha256=azmgtUjHNIPs0WMVNId05SHwiYn41MKVBhKXsQJ5dmY,27
119
119
  sqlframe/standalone/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
120
120
  sqlframe/testing/__init__.py,sha256=VVCosQhitU74A3NnE52O4mNtGZONapuEXcc20QmSlnQ,132
121
121
  sqlframe/testing/utils.py,sha256=PFsGZpwNUE_4-g_f43_vstTqsK0AQ2lBneb5Eb6NkFo,13008
122
- sqlframe-3.13.1.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
123
- sqlframe-3.13.1.dist-info/METADATA,sha256=zvhNqhunI1QLopG1fc8kn9KlZA_YnlWE0WUJX8v1gi4,8970
124
- sqlframe-3.13.1.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
125
- sqlframe-3.13.1.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
126
- sqlframe-3.13.1.dist-info/RECORD,,
122
+ sqlframe-3.13.3.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
123
+ sqlframe-3.13.3.dist-info/METADATA,sha256=eC3F1wnqViGgocYV5HspArMrR-eX1qu5txOdbDqMurc,8970
124
+ sqlframe-3.13.3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
125
+ sqlframe-3.13.3.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
126
+ sqlframe-3.13.3.dist-info/RECORD,,