sqlframe 3.2.0__py3-none-any.whl → 3.3.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.
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.2.0'
16
- __version_tuple__ = version_tuple = (3, 2, 0)
15
+ __version__ = version = '3.3.0'
16
+ __version_tuple__ = version_tuple = (3, 3, 0)
@@ -1627,7 +1627,11 @@ class _BaseDataFrame(t.Generic[SESSION, WRITER, NA, STAT, GROUP_DATA]):
1627
1627
 
1628
1628
  def createOrReplaceTempView(self, name: str) -> None:
1629
1629
  name = normalize_string(name, from_dialect="input")
1630
- self.session.temp_views[name] = self.copy()._convert_leaf_to_cte()
1630
+ df = self.copy()._convert_leaf_to_cte()
1631
+ self.session.temp_views[name] = df
1632
+ self.session.catalog.add_table(
1633
+ name, [x.alias_or_name for x in self._get_outer_select_columns(df.expression)]
1634
+ )
1631
1635
 
1632
1636
  def count(self) -> int:
1633
1637
  if not self.session._has_connection:
@@ -2052,7 +2052,7 @@ def cardinality(col: ColumnOrName) -> Column:
2052
2052
 
2053
2053
  @meta()
2054
2054
  def char(col: ColumnOrName) -> Column:
2055
- return Column.invoke_expression_over_column(col, expression.Chr)
2055
+ return Column(expression.Chr(expressions=Column.ensure_col(col).expression))
2056
2056
 
2057
2057
 
2058
2058
  @meta(unsupported_engines="*")
@@ -2703,7 +2703,7 @@ def inline(col: ColumnOrName) -> Column:
2703
2703
  | 3| 4|
2704
2704
  +---+---+
2705
2705
  """
2706
- return Column.invoke_anonymous_function(col, "inline")
2706
+ return Column.invoke_expression_over_column(col, expression.Inline)
2707
2707
 
2708
2708
 
2709
2709
  @meta(unsupported_engines="*")
sqlframe/base/session.py CHANGED
@@ -391,7 +391,11 @@ class _BaseSession(t.Generic[CATALOG, READER, WRITER, DF, CONN, UDF_REGISTRATION
391
391
  )
392
392
  if qualify:
393
393
  expression = qualify_func(
394
- expression, dialect=dialect, quote_identifiers=False, identify=False
394
+ expression,
395
+ dialect=dialect,
396
+ quote_identifiers=False,
397
+ identify=False,
398
+ schema=self.catalog._schema,
395
399
  )
396
400
  if self.temp_views:
397
401
  replacement_mapping = {}
sqlframe/base/util.py CHANGED
@@ -306,7 +306,6 @@ def quote_preserving_alias_or_name(col: t.Union[exp.Column, exp.Alias]) -> str:
306
306
  def sqlglot_to_spark(sqlglot_dtype: exp.DataType) -> types.DataType:
307
307
  from sqlframe.base import types
308
308
 
309
- sqlglot_to_spark
310
309
  primitive_mapping = {
311
310
  exp.DataType.Type.VARCHAR: types.VarcharType,
312
311
  exp.DataType.Type.CHAR: types.CharType,
@@ -325,6 +324,7 @@ def sqlglot_to_spark(sqlglot_dtype: exp.DataType) -> types.DataType:
325
324
  exp.DataType.Type.TIMESTAMPLTZ: types.TimestampType,
326
325
  exp.DataType.Type.TIMESTAMPNTZ: types.TimestampType,
327
326
  exp.DataType.Type.DATE: types.DateType,
327
+ exp.DataType.Type.JSON: types.StringType,
328
328
  }
329
329
  if sqlglot_dtype.this in primitive_mapping:
330
330
  pyspark_class = primitive_mapping[sqlglot_dtype.this]
@@ -93,6 +93,8 @@ class DuckDBDataFrameReader(_BaseDataFrameReader["DuckDBSession", "DuckDBDataFra
93
93
  else:
94
94
  from_clause = f"'{path}'"
95
95
  df = self.session.sql(exp.select(*select_columns).from_(from_clause), qualify=False)
96
+ if select_columns == [exp.Star()]:
97
+ return self.load(path=path, format=format, schema=df.schema, **options)
96
98
  self.session._last_loaded_file = path # type: ignore
97
99
  return df
98
100
 
@@ -54,8 +54,14 @@ class DuckDBSession(
54
54
 
55
55
  @classmethod
56
56
  def _try_get_map(cls, value: t.Any) -> t.Optional[t.Dict[str, t.Any]]:
57
- if value and isinstance(value, dict) and "key" in value and "value" in value:
58
- return dict(zip(value["key"], value["value"]))
57
+ if value and isinstance(value, dict):
58
+ # DuckDB < 1.1.0 support
59
+ if "key" in value and "value" in value:
60
+ return dict(zip(value["key"], value["value"]))
61
+ # DuckDB >= 1.1.0 support
62
+ # If a key is not a string then it must not represent a column and therefore must be a map
63
+ if len([k for k in value if not isinstance(k, str)]) > 0:
64
+ return value
59
65
  return None
60
66
 
61
67
  def _execute(self, sql: str) -> None:
sqlframe/spark/catalog.py CHANGED
@@ -569,7 +569,9 @@ class SparkCatalog(
569
569
  return [
570
570
  Table(
571
571
  name=normalize_string(x.name, from_dialect="execution", to_dialect="output"),
572
- catalog=normalize_string(x.catalog, from_dialect="execution", to_dialect="output"),
572
+ catalog=normalize_string(x.catalog, from_dialect="execution", to_dialect="output")
573
+ if x.catalog
574
+ else None,
573
575
  namespace=[
574
576
  normalize_string(y, from_dialect="execution", to_dialect="output")
575
577
  for y in x.namespace
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.2.0
3
+ Version: 3.3.0
4
4
  Summary: Turning PySpark Into a Universal DataFrame API
5
5
  Home-page: https://github.com/eakmanrq/sqlframe
6
6
  Author: Ryan Eakman
@@ -18,16 +18,16 @@ Requires-Python: >=3.8
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: LICENSE
20
20
  Requires-Dist: prettytable (<3.11.1)
21
- Requires-Dist: sqlglot (<25.19,>=24.0.0)
21
+ Requires-Dist: sqlglot (<25.22,>=24.0.0)
22
22
  Requires-Dist: typing-extensions (<5,>=4.8)
23
23
  Provides-Extra: bigquery
24
24
  Requires-Dist: google-cloud-bigquery-storage (<3,>=2) ; extra == 'bigquery'
25
25
  Requires-Dist: google-cloud-bigquery[pandas] (<4,>=3) ; extra == 'bigquery'
26
26
  Provides-Extra: dev
27
- Requires-Dist: duckdb (<1.1,>=0.9) ; extra == 'dev'
27
+ Requires-Dist: duckdb (<1.2,>=0.9) ; extra == 'dev'
28
28
  Requires-Dist: findspark (<3,>=2) ; extra == 'dev'
29
29
  Requires-Dist: mypy (<1.12,>=1.10.0) ; extra == 'dev'
30
- Requires-Dist: openai (<1.44,>=1.30) ; extra == 'dev'
30
+ Requires-Dist: openai (<1.46,>=1.30) ; extra == 'dev'
31
31
  Requires-Dist: pandas-stubs (<3,>=2) ; extra == 'dev'
32
32
  Requires-Dist: pandas (<3,>=2) ; extra == 'dev'
33
33
  Requires-Dist: psycopg (<4,>=3.1) ; extra == 'dev'
@@ -47,10 +47,10 @@ Requires-Dist: mkdocs-material (==9.0.5) ; extra == 'docs'
47
47
  Requires-Dist: mkdocs (==1.4.2) ; extra == 'docs'
48
48
  Requires-Dist: pymdown-extensions ; extra == 'docs'
49
49
  Provides-Extra: duckdb
50
- Requires-Dist: duckdb (<1.1,>=0.9) ; extra == 'duckdb'
50
+ Requires-Dist: duckdb (<1.2,>=0.9) ; extra == 'duckdb'
51
51
  Requires-Dist: pandas (<3,>=2) ; extra == 'duckdb'
52
52
  Provides-Extra: openai
53
- Requires-Dist: openai (<1.44,>=1.30) ; extra == 'openai'
53
+ Requires-Dist: openai (<1.46,>=1.30) ; extra == 'openai'
54
54
  Provides-Extra: pandas
55
55
  Requires-Dist: pandas (<3,>=2) ; extra == 'pandas'
56
56
  Provides-Extra: postgres
@@ -1,23 +1,23 @@
1
1
  sqlframe/__init__.py,sha256=E3qCJ4PSEgKz6Hg3ves6LWt3JrQOV8c9HVLSIUOzKNc,3106
2
- sqlframe/_version.py,sha256=h7Mhoil_jhKLMf7jtmaacYtrq1Z2IqB7uz4QBaHSlmw,411
2
+ sqlframe/_version.py,sha256=gpz3Z6rZZLQ9xMKGzMu1kjC8nYs9HNBbzDT8oHplFPY,411
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=C2xj6OHMsJbEgjbI-m5HuIvqHYt2DbbUtCjssKpplNk,17748
7
- sqlframe/base/dataframe.py,sha256=wIYKaV9xzILPVmAcujvRmbH-6dbKPx6hVNHNWCEuayM,71479
7
+ sqlframe/base/dataframe.py,sha256=uTM46auSPniww-ZMtI5s0hrrCG1nOICMEhdZZ8E4cu8,71636
8
8
  sqlframe/base/decorators.py,sha256=Jy4bf8MhZ-AJ6CWTj59bBJRqamtLbPC0USUMFrY6g0w,449
9
9
  sqlframe/base/exceptions.py,sha256=9Uwvqn2eAkDpqm4BrRgbL61qM-GMCbJEMAW8otxO46s,370
10
10
  sqlframe/base/function_alternatives.py,sha256=IxNBqplehkAEkpzA625Dif-9Xyi4Hrho81A9U262rV0,50714
11
- sqlframe/base/functions.py,sha256=2dDfPepAuQvLcxwaZbj9qJeEeiqOaYJDI3vPoZXoM1Q,189959
11
+ sqlframe/base/functions.py,sha256=p1aVgQ3htTLR5-mDzDtEh7W3iTcbt_XOOljLpza-dF8,189984
12
12
  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=-AhNuEzcV7ZExoP1oY3blaKip-joQyJeQVvfBTs_2g4,3456
15
15
  sqlframe/base/readerwriter.py,sha256=FkImnUR_qNASmXktk0JDsFeOzfh799hd09vI2uznNH8,25350
16
- sqlframe/base/session.py,sha256=DgkzSKFc3LdzXiqB9ofsh47Ygivq2-Or6J2XbDLzxVs,25162
16
+ sqlframe/base/session.py,sha256=6vQ2bJa357J1bycx1vMxkIUdcA2YbMIYq956bpytztI,25256
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
20
- sqlframe/base/util.py,sha256=ktQfPBcYyXXLPWCOg9Gg_acjMc83xNykC8CFjuqGU5E,14879
20
+ sqlframe/base/util.py,sha256=9f_PpaQTDOrdKVAZeGdK9s5KQ_fL2vM8A2uulo-E1Pg,14908
21
21
  sqlframe/base/window.py,sha256=8hOv-ignPPIsZA9FzvYzcLE9J_glalVaYjIAUdRUX3o,4943
22
22
  sqlframe/base/mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
23
23
  sqlframe/base/mixins/catalog_mixins.py,sha256=9tn0mK8oPoqIIjNItystD5tdBMdK9YpkxTG7G9KQl8k,18619
@@ -42,8 +42,8 @@ sqlframe/duckdb/dataframe.py,sha256=HZg_uMAz4RsubZJT4-MslUQS_0-InF0_P5Yq5HyJ3wE,
42
42
  sqlframe/duckdb/functions.py,sha256=Ee8o6YFtRdEiq0jNLXxgu5lcbc7Tsg0-lK6oRyxdcjo,1920
43
43
  sqlframe/duckdb/functions.pyi,sha256=Qn6j4zwwuBsh6q9341dR3Z5kpeRsgvM4u6Bb6FekKrI,5827
44
44
  sqlframe/duckdb/group.py,sha256=IkhbW42Ng1U5YT3FkIdiB4zBqRkW4QyTb-1detY1e_4,383
45
- sqlframe/duckdb/readwriter.py,sha256=jcb3WJClTtdQEJPKmVfNZ2lOR1h_2jTB0OgdMFp4POw,4679
46
- sqlframe/duckdb/session.py,sha256=Pho9H74_0xNQPP_oBdFa4aflBAsrxvpXPMQGSKyq1-4,2322
45
+ sqlframe/duckdb/readwriter.py,sha256=iY0Wsms35gymilETOhAQGQCHfH8LCj9_uY8aCdF77ds,4806
46
+ sqlframe/duckdb/session.py,sha256=h0gr4hzGTLTSYN2OECAYjb8HHh2QvSshInxAIUjEEs8,2615
47
47
  sqlframe/duckdb/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,34
48
48
  sqlframe/duckdb/udf.py,sha256=Du9LnOtT1lJvB90D4HSR2tB7MXy179jZngDR-EjVjQk,656
49
49
  sqlframe/duckdb/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
@@ -83,7 +83,7 @@ sqlframe/snowflake/types.py,sha256=KwNyuXIo-2xVVd4bZED3YrQOobKCtemlxGrJL7DrTC8,3
83
83
  sqlframe/snowflake/udf.py,sha256=yzMmky-n5BXFbdldgfzLP8hCrVm0DgruSUCUUy1_3sk,268
84
84
  sqlframe/snowflake/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
85
85
  sqlframe/spark/__init__.py,sha256=QV0eNmY5fL4ulLvAJVVVx2OYFfQXN2KYV3R5cij7HTg,858
86
- sqlframe/spark/catalog.py,sha256=3T4aivgQmAhPTmlVk53jk3VvFBJlp1pKvWKNmTHz1W8,39741
86
+ sqlframe/spark/catalog.py,sha256=8ghHiKz9rBJ2ohm768XIftyi9Htbw-1cSkJUlXemwrI,39796
87
87
  sqlframe/spark/column.py,sha256=E1tUa62Y5HajkhgFuebU9zohrGyieudcHzTT8gfalio,40
88
88
  sqlframe/spark/dataframe.py,sha256=_TD-h7oz0-i80r90v17UoLDoIzcGNchU2SL13ujOOic,1779
89
89
  sqlframe/spark/functions.py,sha256=AQfqfvaojJzCuo9DyDklz0JYZPhn_3dzWvztsklBO0o,586
@@ -107,8 +107,8 @@ sqlframe/standalone/udf.py,sha256=azmgtUjHNIPs0WMVNId05SHwiYn41MKVBhKXsQJ5dmY,27
107
107
  sqlframe/standalone/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
108
108
  sqlframe/testing/__init__.py,sha256=VVCosQhitU74A3NnE52O4mNtGZONapuEXcc20QmSlnQ,132
109
109
  sqlframe/testing/utils.py,sha256=9DDYVuocO7tygee3RaajuJNZ24sJwf_LY556kKg7kTw,13011
110
- sqlframe-3.2.0.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
111
- sqlframe-3.2.0.dist-info/METADATA,sha256=Vy6QKjJpatavSw884IL6gUeeT0ZZDmHyEPQvJEdACpM,8639
112
- sqlframe-3.2.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
113
- sqlframe-3.2.0.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
114
- sqlframe-3.2.0.dist-info/RECORD,,
110
+ sqlframe-3.3.0.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
111
+ sqlframe-3.3.0.dist-info/METADATA,sha256=-o2sCV3CNc0IaqRVHFf84JAqkX63l-l9sZne6A7xsyI,8639
112
+ sqlframe-3.3.0.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92
113
+ sqlframe-3.3.0.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
114
+ sqlframe-3.3.0.dist-info/RECORD,,