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 +2 -2
- sqlframe/base/functions.py +26 -0
- {sqlframe-3.36.2.dist-info → sqlframe-3.36.3.dist-info}/METADATA +2 -1
- {sqlframe-3.36.2.dist-info → sqlframe-3.36.3.dist-info}/RECORD +7 -7
- {sqlframe-3.36.2.dist-info → sqlframe-3.36.3.dist-info}/LICENSE +0 -0
- {sqlframe-3.36.2.dist-info → sqlframe-3.36.3.dist-info}/WHEEL +0 -0
- {sqlframe-3.36.2.dist-info → sqlframe-3.36.3.dist-info}/top_level.txt +0 -0
sqlframe/_version.py
CHANGED
sqlframe/base/functions.py
CHANGED
@@ -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.
|
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=
|
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=
|
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.
|
134
|
-
sqlframe-3.36.
|
135
|
-
sqlframe-3.36.
|
136
|
-
sqlframe-3.36.
|
137
|
-
sqlframe-3.36.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|