sqlframe 3.36.2__py3-none-any.whl → 3.36.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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '3.36.2'
21
- __version_tuple__ = version_tuple = (3, 36, 2)
20
+ __version__ = version = '3.36.3'
21
+ __version_tuple__ = version_tuple = (3, 36, 3)
@@ -1475,6 +1475,32 @@ def timestamp_seconds(col: ColumnOrName) -> Column:
1475
1475
  return Column.invoke_expression_over_column(col, expression.UnixToTime)
1476
1476
 
1477
1477
 
1478
+ @meta()
1479
+ def timestamp_add(unit: str, quantity: ColumnOrName, ts: ColumnOrName) -> Column:
1480
+ session = _get_session()
1481
+
1482
+ if session._is_duckdb or session._is_postgres:
1483
+ quantity = lit(quantity) if isinstance(quantity, int) else quantity
1484
+ if (
1485
+ isinstance(quantity, Column)
1486
+ and isinstance(quantity.expression, expression.Literal)
1487
+ and quantity.expression.is_number
1488
+ and int(quantity.expression.this) < 0
1489
+ ):
1490
+ # If quantity is a negative literal, we use DateSub
1491
+ expr = expression.DateSub
1492
+ quantity.expression.set("this", str(-int(quantity.expression.this)))
1493
+ else:
1494
+ expr = expression.DateAdd # type: ignore
1495
+ return Column.invoke_expression_over_column(
1496
+ ts, expr, expression=quantity, unit=expression.Var(this=unit.upper())
1497
+ )
1498
+
1499
+ return Column.invoke_expression_over_column(
1500
+ ts, expression.TimestampAdd, expression=quantity, unit=expression.Var(this=unit.upper())
1501
+ )
1502
+
1503
+
1478
1504
  @meta(unsupported_engines=["*", "spark"])
1479
1505
  def window(
1480
1506
  timeColumn: ColumnOrName,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: sqlframe
3
- Version: 3.36.2
3
+ Version: 3.36.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
@@ -37,6 +37,7 @@ Requires-Dist: pyarrow <21,>=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 <8,>=6 ; extra == 'dev'
40
+ Requires-Dist: pytest-rerunfailures ; extra == 'dev'
40
41
  Requires-Dist: pytest-xdist <3.9,>=3.6 ; extra == 'dev'
41
42
  Requires-Dist: pytest <8.5,>=8.2.0 ; extra == 'dev'
42
43
  Requires-Dist: ruff <0.13,>=0.4.4 ; extra == 'dev'
@@ -1,5 +1,5 @@
1
1
  sqlframe/__init__.py,sha256=SB80yLTITBXHI2GCDS6n6bN5ObHqgPjfpRPAUwxaots,3403
2
- sqlframe/_version.py,sha256=8n9kfLZeiKlOVTLEVFfs0B2MLJQ8xc2SyKauUUuFT3s,513
2
+ sqlframe/_version.py,sha256=k0__IYrsLFXLDTAPbWVSipvAv_-Gzp6mw1szlQWJb_o,513
3
3
  sqlframe/py.typed,sha256=Nqnn8clbgv-5l0PgxcTOldg8mkMKrFn4TvPL-rYUUGg,1
4
4
  sqlframe/base/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  sqlframe/base/_typing.py,sha256=b2clI5HI1zEZKB_3Msx3FeAJQyft44ubUifJwQRVXyQ,1298
@@ -9,7 +9,7 @@ sqlframe/base/dataframe.py,sha256=0diYONDlet8iZt49LC3vcmfXHAAZ2MovPL2pTXYHj2U,85
9
9
  sqlframe/base/decorators.py,sha256=IhE5xNQDkwJHacCvulq5WpUKyKmXm7dL2A3o5WuKGP4,2131
10
10
  sqlframe/base/exceptions.py,sha256=9Uwvqn2eAkDpqm4BrRgbL61qM-GMCbJEMAW8otxO46s,370
11
11
  sqlframe/base/function_alternatives.py,sha256=aTu3nQhIAkZoxrI1IpjpaHEAMxBNms0AnhS0EMR-TwY,51727
12
- sqlframe/base/functions.py,sha256=n1MsfJt2WWUk7-YwbfByWG065g0W45AwJVIME5H-QJU,225875
12
+ sqlframe/base/functions.py,sha256=jcZZZkylIy6jktXkyqVgSpJgUSgA0g8qjO0SGDwQD30,226902
13
13
  sqlframe/base/group.py,sha256=fBm8EUve7W7xz11nybTXr09ih-yZxL_vvEiZVE1eb_0,12025
14
14
  sqlframe/base/normalize.py,sha256=nXAJ5CwxVf4DV0GsH-q1w0p8gmjSMlv96k_ez1eVul8,3880
15
15
  sqlframe/base/operations.py,sha256=g-YNcbvNKTOBbYm23GKfB3fmydlR7ZZDAuZUtXIHtzw,4438
@@ -130,8 +130,8 @@ sqlframe/standalone/udf.py,sha256=azmgtUjHNIPs0WMVNId05SHwiYn41MKVBhKXsQJ5dmY,27
130
130
  sqlframe/standalone/window.py,sha256=6GKPzuxeSapJakBaKBeT9VpED1ACdjggDv9JRILDyV0,35
131
131
  sqlframe/testing/__init__.py,sha256=VVCosQhitU74A3NnE52O4mNtGZONapuEXcc20QmSlnQ,132
132
132
  sqlframe/testing/utils.py,sha256=PFsGZpwNUE_4-g_f43_vstTqsK0AQ2lBneb5Eb6NkFo,13008
133
- sqlframe-3.36.2.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
134
- sqlframe-3.36.2.dist-info/METADATA,sha256=G40goRUAdQg115DFuLq6-RYZ_6OSyBJ0zRsPHu7mhMQ,8987
135
- sqlframe-3.36.2.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
136
- sqlframe-3.36.2.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
137
- sqlframe-3.36.2.dist-info/RECORD,,
133
+ sqlframe-3.36.3.dist-info/LICENSE,sha256=VZu79YgW780qxaFJMr0t5ZgbOYEh04xWoxaWOaqIGWk,1068
134
+ sqlframe-3.36.3.dist-info/METADATA,sha256=1G_ICerBb0qaFNlT8OdNQrmHtkI_gIbW8xOQyPlrAO0,9040
135
+ sqlframe-3.36.3.dist-info/WHEEL,sha256=oiQVh_5PnQM0E3gPdiz09WCNmwiHDMaGer_elqB3coM,92
136
+ sqlframe-3.36.3.dist-info/top_level.txt,sha256=T0_RpoygaZSF6heeWwIDQgaP0varUdSK1pzjeJZRjM8,9
137
+ sqlframe-3.36.3.dist-info/RECORD,,