datazone-sdk 6.0.0.dev1__tar.gz → 6.0.1.dev2__tar.gz

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 (21) hide show
  1. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/PKG-INFO +1 -1
  2. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/generated_columns.py +12 -7
  3. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/table.py +22 -4
  4. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/pyproject.toml +1 -1
  5. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/README.md +0 -0
  6. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/__init__.py +0 -0
  7. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/backtesting.py +0 -0
  8. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/caching/__init__.py +0 -0
  9. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/caching/parquet.py +0 -0
  10. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/db/__init__.py +0 -0
  11. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/db/base.py +0 -0
  12. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/db/cached.py +0 -0
  13. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/db/snapshot.py +0 -0
  14. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/db/standard.py +0 -0
  15. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/__init__.py +0 -0
  16. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/data_types.py +0 -0
  17. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/schema.py +0 -0
  18. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/slicing.py +0 -0
  19. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/deltastorage/store.py +0 -0
  20. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/testing/__init__.py +0 -0
  21. {datazone_sdk-6.0.0.dev1 → datazone_sdk-6.0.1.dev2}/datazone/testing/database_client.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: datazone-sdk
3
- Version: 6.0.0.dev1
3
+ Version: 6.0.1.dev2
4
4
  Summary: Database and Delta storage client library for working with Delta Lake tables
5
5
  Author: Team Enigma
6
6
  Author-email: enigma@energinet.dk
@@ -97,18 +97,23 @@ class DateBucket(GeneratedColumn):
97
97
  Returns:
98
98
  tuple[str, dt.date]: List of conditions on the generated column
99
99
  """
100
- timestamp = copy.copy(value)
101
- if self.as_tz is not None:
102
- timestamp = timestamp.astimezone(ZoneInfo(self.as_tz))
103
- date = timestamp.date()
100
+
101
+ def date_from_timestamp(timestamp: dt.datetime) -> dt.date:
102
+ timestamp = copy.copy(timestamp)
103
+ if self.as_tz is not None:
104
+ timestamp = timestamp.astimezone(ZoneInfo(self.as_tz))
105
+ return timestamp.date()
104
106
 
105
107
  match op:
106
108
  case "=":
107
- return [("=", date)]
109
+ return [("=", date_from_timestamp(value))]
108
110
  case ("<" | "<="):
109
- return [("<=", date)]
111
+ return [("<=", date_from_timestamp(value))]
110
112
  case (">" | ">="):
111
- return [(">=", date)]
113
+ return [(">=", date_from_timestamp(value))]
114
+ case "in":
115
+ dates = [date_from_timestamp(timestamp) for timestamp in value]
116
+ return [("in", list(dict.fromkeys(dates)))]
112
117
  case _:
113
118
  # for other operations, we cannot make any
114
119
  # useful filters on the generated column
@@ -1,3 +1,4 @@
1
+ import datetime as dt
1
2
  from typing import Any, Optional
2
3
 
3
4
  import deltalake as dl
@@ -8,6 +9,21 @@ from .schema import Schema
8
9
  from .slicing import HyperSlice
9
10
 
10
11
 
12
+ def _sql_literal(value: Any) -> str:
13
+ if isinstance(value, dt.datetime):
14
+ return f"'{value.isoformat()}'"
15
+ if isinstance(value, dt.date):
16
+ return f"'{value.isoformat()}'"
17
+ if isinstance(value, str):
18
+ escaped_value = value.replace("'", "''")
19
+ return f"'{escaped_value}'"
20
+ if isinstance(value, bool):
21
+ return "TRUE" if value else "FALSE"
22
+ if value is None:
23
+ return "NULL"
24
+ return str(value)
25
+
26
+
11
27
  def _dnf_to_sql(dnf: list[tuple]) -> str:
12
28
  """Convert DNF expression to SQL expression."""
13
29
  if len(dnf) == 0:
@@ -17,10 +33,13 @@ def _dnf_to_sql(dnf: list[tuple]) -> str:
17
33
  for col, op, val in dnf:
18
34
  if op == "in":
19
35
  assert isinstance(val, list)
20
- lst = ", ".join([f"'{item}'" for item in val])
21
- sql_parts.append(f"{col} IN ({lst})")
36
+ if len(val) == 0:
37
+ sql_parts.append("false")
38
+ else:
39
+ values = " OR ".join([f"{col} = {_sql_literal(item)}" for item in val])
40
+ sql_parts.append(f"({values})")
22
41
  elif op in [">=", "<=", ">", "<", "="]:
23
- sql_parts.append(f"{col} {op} '{val}'")
42
+ sql_parts.append(f"{col} {op} {_sql_literal(val)}")
24
43
  else:
25
44
  raise ValueError(f"Unsupported operation: {op}")
26
45
 
@@ -159,7 +178,6 @@ class Table:
159
178
  schema = self.schema()
160
179
  data = self._to_writable_pyarrow_table(df=df, schema=schema)
161
180
 
162
- hyper_slice = schema.add_generated_filters(hyper_slice)
163
181
  if len(hyper_slice) == 0:
164
182
  predicate = None
165
183
  else:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "datazone-sdk"
3
- version = "6.0.0.dev1"
3
+ version = "6.0.1.dev2"
4
4
  description = "Database and Delta storage client library for working with Delta Lake tables"
5
5
  authors = [{ name = "Team Enigma", email = "enigma@energinet.dk" }]
6
6
  requires-python = ">=3.10"