polars-runtime-compat 1.34.0b2__cp39-abi3-win_arm64.whl → 1.34.0b4__cp39-abi3-win_arm64.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.
Potentially problematic release.
This version of polars-runtime-compat might be problematic. Click here for more details.
- _polars_runtime_compat/_polars_runtime_compat.pyd +0 -0
- {polars_runtime_compat-1.34.0b2.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/METADATA +1 -1
- polars_runtime_compat-1.34.0b4.dist-info/RECORD +6 -0
- polars/__init__.py +0 -528
- polars/_cpu_check.py +0 -265
- polars/_dependencies.py +0 -355
- polars/_plr.py +0 -99
- polars/_plr.pyi +0 -2496
- polars/_reexport.py +0 -23
- polars/_typing.py +0 -478
- polars/_utils/__init__.py +0 -37
- polars/_utils/async_.py +0 -102
- polars/_utils/cache.py +0 -176
- polars/_utils/cloud.py +0 -40
- polars/_utils/constants.py +0 -29
- polars/_utils/construction/__init__.py +0 -46
- polars/_utils/construction/dataframe.py +0 -1397
- polars/_utils/construction/other.py +0 -72
- polars/_utils/construction/series.py +0 -560
- polars/_utils/construction/utils.py +0 -118
- polars/_utils/convert.py +0 -224
- polars/_utils/deprecation.py +0 -406
- polars/_utils/getitem.py +0 -457
- polars/_utils/logging.py +0 -11
- polars/_utils/nest_asyncio.py +0 -264
- polars/_utils/parquet.py +0 -15
- polars/_utils/parse/__init__.py +0 -12
- polars/_utils/parse/expr.py +0 -242
- polars/_utils/polars_version.py +0 -19
- polars/_utils/pycapsule.py +0 -53
- polars/_utils/scan.py +0 -27
- polars/_utils/serde.py +0 -63
- polars/_utils/slice.py +0 -215
- polars/_utils/udfs.py +0 -1251
- polars/_utils/unstable.py +0 -63
- polars/_utils/various.py +0 -782
- polars/_utils/wrap.py +0 -25
- polars/api.py +0 -370
- polars/catalog/__init__.py +0 -0
- polars/catalog/unity/__init__.py +0 -19
- polars/catalog/unity/client.py +0 -733
- polars/catalog/unity/models.py +0 -152
- polars/config.py +0 -1571
- polars/convert/__init__.py +0 -25
- polars/convert/general.py +0 -1046
- polars/convert/normalize.py +0 -261
- polars/dataframe/__init__.py +0 -5
- polars/dataframe/_html.py +0 -186
- polars/dataframe/frame.py +0 -12582
- polars/dataframe/group_by.py +0 -1067
- polars/dataframe/plotting.py +0 -257
- polars/datatype_expr/__init__.py +0 -5
- polars/datatype_expr/array.py +0 -56
- polars/datatype_expr/datatype_expr.py +0 -304
- polars/datatype_expr/list.py +0 -18
- polars/datatype_expr/struct.py +0 -69
- polars/datatypes/__init__.py +0 -122
- polars/datatypes/_parse.py +0 -195
- polars/datatypes/_utils.py +0 -48
- polars/datatypes/classes.py +0 -1213
- polars/datatypes/constants.py +0 -11
- polars/datatypes/constructor.py +0 -172
- polars/datatypes/convert.py +0 -366
- polars/datatypes/group.py +0 -130
- polars/exceptions.py +0 -230
- polars/expr/__init__.py +0 -7
- polars/expr/array.py +0 -964
- polars/expr/binary.py +0 -346
- polars/expr/categorical.py +0 -306
- polars/expr/datetime.py +0 -2620
- polars/expr/expr.py +0 -11272
- polars/expr/list.py +0 -1408
- polars/expr/meta.py +0 -444
- polars/expr/name.py +0 -321
- polars/expr/string.py +0 -3045
- polars/expr/struct.py +0 -357
- polars/expr/whenthen.py +0 -185
- polars/functions/__init__.py +0 -193
- polars/functions/aggregation/__init__.py +0 -33
- polars/functions/aggregation/horizontal.py +0 -298
- polars/functions/aggregation/vertical.py +0 -341
- polars/functions/as_datatype.py +0 -848
- polars/functions/business.py +0 -138
- polars/functions/col.py +0 -384
- polars/functions/datatype.py +0 -121
- polars/functions/eager.py +0 -524
- polars/functions/escape_regex.py +0 -29
- polars/functions/lazy.py +0 -2751
- polars/functions/len.py +0 -68
- polars/functions/lit.py +0 -210
- polars/functions/random.py +0 -22
- polars/functions/range/__init__.py +0 -19
- polars/functions/range/_utils.py +0 -15
- polars/functions/range/date_range.py +0 -303
- polars/functions/range/datetime_range.py +0 -370
- polars/functions/range/int_range.py +0 -348
- polars/functions/range/linear_space.py +0 -311
- polars/functions/range/time_range.py +0 -287
- polars/functions/repeat.py +0 -301
- polars/functions/whenthen.py +0 -353
- polars/interchange/__init__.py +0 -10
- polars/interchange/buffer.py +0 -77
- polars/interchange/column.py +0 -190
- polars/interchange/dataframe.py +0 -230
- polars/interchange/from_dataframe.py +0 -328
- polars/interchange/protocol.py +0 -303
- polars/interchange/utils.py +0 -170
- polars/io/__init__.py +0 -64
- polars/io/_utils.py +0 -317
- polars/io/avro.py +0 -49
- polars/io/clipboard.py +0 -36
- polars/io/cloud/__init__.py +0 -17
- polars/io/cloud/_utils.py +0 -80
- polars/io/cloud/credential_provider/__init__.py +0 -17
- polars/io/cloud/credential_provider/_builder.py +0 -520
- polars/io/cloud/credential_provider/_providers.py +0 -618
- polars/io/csv/__init__.py +0 -9
- polars/io/csv/_utils.py +0 -38
- polars/io/csv/batched_reader.py +0 -142
- polars/io/csv/functions.py +0 -1495
- polars/io/database/__init__.py +0 -6
- polars/io/database/_arrow_registry.py +0 -70
- polars/io/database/_cursor_proxies.py +0 -147
- polars/io/database/_executor.py +0 -578
- polars/io/database/_inference.py +0 -314
- polars/io/database/_utils.py +0 -144
- polars/io/database/functions.py +0 -516
- polars/io/delta.py +0 -499
- polars/io/iceberg/__init__.py +0 -3
- polars/io/iceberg/_utils.py +0 -697
- polars/io/iceberg/dataset.py +0 -556
- polars/io/iceberg/functions.py +0 -151
- polars/io/ipc/__init__.py +0 -8
- polars/io/ipc/functions.py +0 -514
- polars/io/json/__init__.py +0 -3
- polars/io/json/read.py +0 -101
- polars/io/ndjson.py +0 -332
- polars/io/parquet/__init__.py +0 -17
- polars/io/parquet/field_overwrites.py +0 -140
- polars/io/parquet/functions.py +0 -722
- polars/io/partition.py +0 -491
- polars/io/plugins.py +0 -187
- polars/io/pyarrow_dataset/__init__.py +0 -5
- polars/io/pyarrow_dataset/anonymous_scan.py +0 -109
- polars/io/pyarrow_dataset/functions.py +0 -79
- polars/io/scan_options/__init__.py +0 -5
- polars/io/scan_options/_options.py +0 -59
- polars/io/scan_options/cast_options.py +0 -126
- polars/io/spreadsheet/__init__.py +0 -6
- polars/io/spreadsheet/_utils.py +0 -52
- polars/io/spreadsheet/_write_utils.py +0 -647
- polars/io/spreadsheet/functions.py +0 -1323
- polars/lazyframe/__init__.py +0 -9
- polars/lazyframe/engine_config.py +0 -61
- polars/lazyframe/frame.py +0 -8564
- polars/lazyframe/group_by.py +0 -669
- polars/lazyframe/in_process.py +0 -42
- polars/lazyframe/opt_flags.py +0 -333
- polars/meta/__init__.py +0 -14
- polars/meta/build.py +0 -33
- polars/meta/index_type.py +0 -27
- polars/meta/thread_pool.py +0 -50
- polars/meta/versions.py +0 -120
- polars/ml/__init__.py +0 -0
- polars/ml/torch.py +0 -213
- polars/ml/utilities.py +0 -30
- polars/plugins.py +0 -155
- polars/py.typed +0 -0
- polars/pyproject.toml +0 -96
- polars/schema.py +0 -265
- polars/selectors.py +0 -3117
- polars/series/__init__.py +0 -5
- polars/series/array.py +0 -776
- polars/series/binary.py +0 -254
- polars/series/categorical.py +0 -246
- polars/series/datetime.py +0 -2275
- polars/series/list.py +0 -1087
- polars/series/plotting.py +0 -191
- polars/series/series.py +0 -9197
- polars/series/string.py +0 -2367
- polars/series/struct.py +0 -154
- polars/series/utils.py +0 -191
- polars/sql/__init__.py +0 -7
- polars/sql/context.py +0 -677
- polars/sql/functions.py +0 -139
- polars/string_cache.py +0 -185
- polars/testing/__init__.py +0 -13
- polars/testing/asserts/__init__.py +0 -9
- polars/testing/asserts/frame.py +0 -231
- polars/testing/asserts/series.py +0 -219
- polars/testing/asserts/utils.py +0 -12
- polars/testing/parametric/__init__.py +0 -33
- polars/testing/parametric/profiles.py +0 -107
- polars/testing/parametric/strategies/__init__.py +0 -22
- polars/testing/parametric/strategies/_utils.py +0 -14
- polars/testing/parametric/strategies/core.py +0 -615
- polars/testing/parametric/strategies/data.py +0 -452
- polars/testing/parametric/strategies/dtype.py +0 -436
- polars/testing/parametric/strategies/legacy.py +0 -169
- polars/type_aliases.py +0 -24
- polars_runtime_compat-1.34.0b2.dist-info/RECORD +0 -203
- {polars_runtime_compat-1.34.0b2.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/WHEEL +0 -0
- {polars_runtime_compat-1.34.0b2.dist-info → polars_runtime_compat-1.34.0b4.dist-info}/licenses/LICENSE +0 -0
polars/io/database/_inference.py
DELETED
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import functools
|
|
4
|
-
import re
|
|
5
|
-
from contextlib import suppress
|
|
6
|
-
from inspect import isclass
|
|
7
|
-
from typing import TYPE_CHECKING, Any
|
|
8
|
-
|
|
9
|
-
from polars.datatypes import (
|
|
10
|
-
Binary,
|
|
11
|
-
Boolean,
|
|
12
|
-
Date,
|
|
13
|
-
Datetime,
|
|
14
|
-
Decimal,
|
|
15
|
-
Duration,
|
|
16
|
-
Float32,
|
|
17
|
-
Float64,
|
|
18
|
-
Int8,
|
|
19
|
-
Int16,
|
|
20
|
-
Int32,
|
|
21
|
-
Int64,
|
|
22
|
-
Int128,
|
|
23
|
-
List,
|
|
24
|
-
Null,
|
|
25
|
-
String,
|
|
26
|
-
Time,
|
|
27
|
-
UInt8,
|
|
28
|
-
UInt16,
|
|
29
|
-
UInt32,
|
|
30
|
-
UInt64,
|
|
31
|
-
)
|
|
32
|
-
from polars.datatypes._parse import parse_py_type_into_dtype
|
|
33
|
-
from polars.datatypes.group import (
|
|
34
|
-
INTEGER_DTYPES,
|
|
35
|
-
UNSIGNED_INTEGER_DTYPES,
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
if TYPE_CHECKING:
|
|
39
|
-
from polars._typing import PolarsDataType
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def dtype_from_database_typename(
|
|
43
|
-
value: str,
|
|
44
|
-
*,
|
|
45
|
-
raise_unmatched: bool = True,
|
|
46
|
-
) -> PolarsDataType | None:
|
|
47
|
-
"""
|
|
48
|
-
Attempt to infer Polars dtype from database cursor `type_code` string value.
|
|
49
|
-
|
|
50
|
-
Examples
|
|
51
|
-
--------
|
|
52
|
-
>>> dtype_from_database_typename("INT2")
|
|
53
|
-
Int16
|
|
54
|
-
>>> dtype_from_database_typename("NVARCHAR")
|
|
55
|
-
String
|
|
56
|
-
>>> dtype_from_database_typename("NUMERIC(10,2)")
|
|
57
|
-
Decimal(precision=10, scale=2)
|
|
58
|
-
>>> dtype_from_database_typename("TIMESTAMP WITHOUT TZ")
|
|
59
|
-
Datetime(time_unit='us', time_zone=None)
|
|
60
|
-
"""
|
|
61
|
-
dtype: PolarsDataType | None = None
|
|
62
|
-
|
|
63
|
-
# normalise string name/case (eg: 'IntegerType' -> 'INTEGER')
|
|
64
|
-
original_value = value
|
|
65
|
-
value = value.upper().replace("TYPE", "")
|
|
66
|
-
|
|
67
|
-
# extract optional type modifier (eg: 'VARCHAR(64)' -> '64')
|
|
68
|
-
if re.search(r"\([\w,: ]+\)$", value):
|
|
69
|
-
modifier = value[value.find("(") + 1 : -1]
|
|
70
|
-
value = value.split("(")[0]
|
|
71
|
-
elif (
|
|
72
|
-
not value.startswith(("<", ">")) and re.search(r"\[[\w,\]\[: ]+]$", value)
|
|
73
|
-
) or value.endswith(("[S]", "[MS]", "[US]", "[NS]")):
|
|
74
|
-
modifier = value[value.find("[") + 1 : -1]
|
|
75
|
-
value = value.split("[")[0]
|
|
76
|
-
else:
|
|
77
|
-
modifier = ""
|
|
78
|
-
|
|
79
|
-
# array dtypes
|
|
80
|
-
array_aliases = ("ARRAY", "LIST", "[]")
|
|
81
|
-
if value.endswith(array_aliases) or value.startswith(array_aliases):
|
|
82
|
-
for a in array_aliases:
|
|
83
|
-
value = value.replace(a, "", 1) if value else ""
|
|
84
|
-
|
|
85
|
-
nested: PolarsDataType | None = None
|
|
86
|
-
if not value and modifier:
|
|
87
|
-
nested = dtype_from_database_typename(
|
|
88
|
-
value=modifier,
|
|
89
|
-
raise_unmatched=False,
|
|
90
|
-
)
|
|
91
|
-
else:
|
|
92
|
-
if inner_value := dtype_from_database_typename(
|
|
93
|
-
value[1:-1]
|
|
94
|
-
if (value[0], value[-1]) == ("<", ">")
|
|
95
|
-
else re.sub(r"\W", "", re.sub(r"\WOF\W", "", value)),
|
|
96
|
-
raise_unmatched=False,
|
|
97
|
-
):
|
|
98
|
-
nested = inner_value
|
|
99
|
-
elif modifier:
|
|
100
|
-
nested = dtype_from_database_typename(
|
|
101
|
-
value=modifier,
|
|
102
|
-
raise_unmatched=False,
|
|
103
|
-
)
|
|
104
|
-
if nested:
|
|
105
|
-
dtype = List(nested)
|
|
106
|
-
|
|
107
|
-
# float dtypes
|
|
108
|
-
elif value.startswith("FLOAT") or ("DOUBLE" in value) or (value == "REAL"):
|
|
109
|
-
dtype = (
|
|
110
|
-
Float32
|
|
111
|
-
if value == "FLOAT4"
|
|
112
|
-
or (value.endswith(("16", "32")) or (modifier in ("16", "32")))
|
|
113
|
-
else Float64
|
|
114
|
-
)
|
|
115
|
-
|
|
116
|
-
# integer dtypes
|
|
117
|
-
elif ("INTERVAL" not in value) and (
|
|
118
|
-
value.startswith(("INT", "UINT", "UNSIGNED"))
|
|
119
|
-
or value.endswith(("INT", "SERIAL"))
|
|
120
|
-
or ("INTEGER" in value)
|
|
121
|
-
or value in ("TINY", "SHORT", "LONG", "LONGLONG", "ROWID")
|
|
122
|
-
):
|
|
123
|
-
sz: Any
|
|
124
|
-
if "HUGEINT" in value:
|
|
125
|
-
sz = 128
|
|
126
|
-
elif (
|
|
127
|
-
"LARGE" in value or value.startswith("BIG") or value in ("INT8", "LONGLONG")
|
|
128
|
-
):
|
|
129
|
-
sz = 64
|
|
130
|
-
elif "MEDIUM" in value or value in ("INT4", "UINT4", "LONG", "SERIAL"):
|
|
131
|
-
sz = 32
|
|
132
|
-
elif "SMALL" in value or value in ("INT2", "UINT2", "SHORT"):
|
|
133
|
-
sz = 16
|
|
134
|
-
elif "TINY" in value:
|
|
135
|
-
sz = 8
|
|
136
|
-
elif n := re.sub(r"^\D+", "", value):
|
|
137
|
-
if (sz := int(n)) <= 8:
|
|
138
|
-
sz = sz * 8
|
|
139
|
-
else:
|
|
140
|
-
sz = None
|
|
141
|
-
|
|
142
|
-
sz = modifier if (not sz and modifier) else sz
|
|
143
|
-
if not isinstance(sz, int):
|
|
144
|
-
sz = int(sz) if isinstance(sz, str) and sz.isdigit() else None
|
|
145
|
-
if (
|
|
146
|
-
("U" in value and "MEDIUM" not in value)
|
|
147
|
-
or ("UNSIGNED" in value)
|
|
148
|
-
or value == "ROWID"
|
|
149
|
-
):
|
|
150
|
-
dtype = integer_dtype_from_nbits(sz, unsigned=True, default=UInt64)
|
|
151
|
-
else:
|
|
152
|
-
dtype = integer_dtype_from_nbits(sz, unsigned=False, default=Int64)
|
|
153
|
-
|
|
154
|
-
# number types (note: 'number' alone is not that helpful and requires refinement)
|
|
155
|
-
elif "NUMBER" in value and "CARDINAL" in value:
|
|
156
|
-
dtype = UInt64
|
|
157
|
-
|
|
158
|
-
# decimal dtypes
|
|
159
|
-
elif (is_dec := ("DECIMAL" in value)) or ("NUMERIC" in value):
|
|
160
|
-
if "," in modifier:
|
|
161
|
-
prec, scale = modifier.split(",")
|
|
162
|
-
dtype = Decimal(int(prec), int(scale))
|
|
163
|
-
else:
|
|
164
|
-
dtype = Decimal if is_dec else Float64
|
|
165
|
-
|
|
166
|
-
# string dtypes
|
|
167
|
-
elif (
|
|
168
|
-
any(tp in value for tp in ("VARCHAR", "STRING", "TEXT", "UNICODE"))
|
|
169
|
-
or value.startswith(("STR", "CHAR", "BPCHAR", "NCHAR", "UTF"))
|
|
170
|
-
or value.endswith(("_UTF8", "_UTF16", "_UTF32"))
|
|
171
|
-
):
|
|
172
|
-
dtype = String
|
|
173
|
-
|
|
174
|
-
# binary dtypes
|
|
175
|
-
elif value in ("BYTEA", "BYTES", "BLOB", "CLOB", "BINARY"):
|
|
176
|
-
dtype = Binary
|
|
177
|
-
|
|
178
|
-
# boolean dtypes
|
|
179
|
-
elif value.startswith("BOOL"):
|
|
180
|
-
dtype = Boolean
|
|
181
|
-
|
|
182
|
-
# null dtype; odd, but valid
|
|
183
|
-
elif value == "NULL":
|
|
184
|
-
dtype = Null
|
|
185
|
-
|
|
186
|
-
# temporal dtypes
|
|
187
|
-
elif value.startswith(("DATETIME", "TIMESTAMP")) and not (value.endswith("[D]")):
|
|
188
|
-
if any((tz in value.replace(" ", "")) for tz in ("TZ", "TIMEZONE")):
|
|
189
|
-
if "WITHOUT" not in value:
|
|
190
|
-
return None # there's a timezone, but we don't know what it is
|
|
191
|
-
unit = timeunit_from_precision(modifier) if modifier else "us"
|
|
192
|
-
dtype = Datetime(time_unit=(unit or "us")) # type: ignore[arg-type]
|
|
193
|
-
else:
|
|
194
|
-
value = re.sub(r"\d", "", value)
|
|
195
|
-
if value in ("INTERVAL", "TIMEDELTA", "DURATION"):
|
|
196
|
-
dtype = Duration
|
|
197
|
-
elif value == "DATE":
|
|
198
|
-
dtype = Date
|
|
199
|
-
elif value == "TIME":
|
|
200
|
-
dtype = Time
|
|
201
|
-
|
|
202
|
-
if not dtype and raise_unmatched:
|
|
203
|
-
msg = f"cannot infer dtype from {original_value!r} string value"
|
|
204
|
-
raise ValueError(msg)
|
|
205
|
-
|
|
206
|
-
return dtype
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
def dtype_from_cursor_description(
|
|
210
|
-
cursor: Any,
|
|
211
|
-
description: tuple[Any, ...],
|
|
212
|
-
) -> PolarsDataType | None:
|
|
213
|
-
"""Attempt to infer Polars dtype from database cursor description `type_code`."""
|
|
214
|
-
type_code, _disp_size, internal_size, precision, scale, *_ = description
|
|
215
|
-
dtype: PolarsDataType | None = None
|
|
216
|
-
|
|
217
|
-
if isclass(type_code):
|
|
218
|
-
# python types, eg: int, float, str, etc
|
|
219
|
-
with suppress(TypeError):
|
|
220
|
-
dtype = parse_py_type_into_dtype(type_code) # type: ignore[arg-type]
|
|
221
|
-
|
|
222
|
-
elif isinstance(type_code, str):
|
|
223
|
-
# database/sql type names, eg: "VARCHAR", "NUMERIC", "BLOB", etc
|
|
224
|
-
dtype = dtype_from_database_typename(
|
|
225
|
-
value=type_code,
|
|
226
|
-
raise_unmatched=False,
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
# check additional cursor attrs to refine dtype specification
|
|
230
|
-
if dtype is not None:
|
|
231
|
-
if dtype == Float64 and internal_size == 4:
|
|
232
|
-
dtype = Float32
|
|
233
|
-
|
|
234
|
-
elif dtype in INTEGER_DTYPES and internal_size in (2, 4, 8):
|
|
235
|
-
bits = internal_size * 8
|
|
236
|
-
dtype = integer_dtype_from_nbits(
|
|
237
|
-
bits,
|
|
238
|
-
unsigned=(dtype in UNSIGNED_INTEGER_DTYPES),
|
|
239
|
-
default=dtype,
|
|
240
|
-
)
|
|
241
|
-
elif (
|
|
242
|
-
dtype == Decimal
|
|
243
|
-
and isinstance(precision, int)
|
|
244
|
-
and isinstance(scale, int)
|
|
245
|
-
and precision <= 38
|
|
246
|
-
and scale <= 38
|
|
247
|
-
):
|
|
248
|
-
dtype = Decimal(precision, scale)
|
|
249
|
-
|
|
250
|
-
return dtype
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
@functools.lru_cache(8)
|
|
254
|
-
def integer_dtype_from_nbits(
|
|
255
|
-
bits: int,
|
|
256
|
-
*,
|
|
257
|
-
unsigned: bool,
|
|
258
|
-
default: PolarsDataType | None = None,
|
|
259
|
-
) -> PolarsDataType | None:
|
|
260
|
-
"""
|
|
261
|
-
Return matching Polars integer dtype from num bits and signed/unsigned flag.
|
|
262
|
-
|
|
263
|
-
Examples
|
|
264
|
-
--------
|
|
265
|
-
>>> integer_dtype_from_nbits(8, unsigned=False)
|
|
266
|
-
Int8
|
|
267
|
-
>>> integer_dtype_from_nbits(32, unsigned=True)
|
|
268
|
-
UInt32
|
|
269
|
-
"""
|
|
270
|
-
dtype = {
|
|
271
|
-
(8, False): Int8,
|
|
272
|
-
(8, True): UInt8,
|
|
273
|
-
(16, False): Int16,
|
|
274
|
-
(16, True): UInt16,
|
|
275
|
-
(32, False): Int32,
|
|
276
|
-
(32, True): UInt32,
|
|
277
|
-
(64, False): Int64,
|
|
278
|
-
(64, True): UInt64,
|
|
279
|
-
(128, False): Int128,
|
|
280
|
-
(128, True): Int128, # UInt128 not (yet?) supported
|
|
281
|
-
}.get((bits, unsigned), None)
|
|
282
|
-
|
|
283
|
-
if dtype is None and default is not None:
|
|
284
|
-
return default
|
|
285
|
-
return dtype
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
def timeunit_from_precision(precision: int | str | None) -> str | None:
|
|
289
|
-
"""
|
|
290
|
-
Return `time_unit` from integer precision value.
|
|
291
|
-
|
|
292
|
-
Examples
|
|
293
|
-
--------
|
|
294
|
-
>>> timeunit_from_precision(3)
|
|
295
|
-
'ms'
|
|
296
|
-
>>> timeunit_from_precision(5)
|
|
297
|
-
'us'
|
|
298
|
-
>>> timeunit_from_precision(7)
|
|
299
|
-
'ns'
|
|
300
|
-
"""
|
|
301
|
-
from math import ceil
|
|
302
|
-
|
|
303
|
-
if not precision:
|
|
304
|
-
return None
|
|
305
|
-
elif isinstance(precision, str):
|
|
306
|
-
if precision.isdigit():
|
|
307
|
-
precision = int(precision)
|
|
308
|
-
elif (precision := precision.lower()) in ("s", "ms", "us", "ns"):
|
|
309
|
-
return "ms" if precision == "s" else precision
|
|
310
|
-
try:
|
|
311
|
-
n = min(max(3, int(ceil(precision / 3)) * 3), 9) # type: ignore[operator]
|
|
312
|
-
return {3: "ms", 6: "us", 9: "ns"}.get(n)
|
|
313
|
-
except TypeError:
|
|
314
|
-
return None
|
polars/io/database/_utils.py
DELETED
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import re
|
|
4
|
-
from importlib import import_module
|
|
5
|
-
from typing import TYPE_CHECKING, Any
|
|
6
|
-
|
|
7
|
-
from polars._dependencies import import_optional
|
|
8
|
-
from polars._utils.various import parse_version
|
|
9
|
-
from polars.convert import from_arrow
|
|
10
|
-
from polars.exceptions import ModuleUpgradeRequiredError
|
|
11
|
-
|
|
12
|
-
if TYPE_CHECKING:
|
|
13
|
-
from collections.abc import Coroutine
|
|
14
|
-
|
|
15
|
-
from polars import DataFrame
|
|
16
|
-
from polars._typing import SchemaDict
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
def _run_async(co: Coroutine[Any, Any, Any]) -> Any:
|
|
20
|
-
"""Run asynchronous code as if it was synchronous."""
|
|
21
|
-
import asyncio
|
|
22
|
-
|
|
23
|
-
import polars._utils.nest_asyncio
|
|
24
|
-
|
|
25
|
-
polars._utils.nest_asyncio.apply() # type: ignore[attr-defined]
|
|
26
|
-
return asyncio.run(co)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def _read_sql_connectorx(
|
|
30
|
-
query: str | list[str],
|
|
31
|
-
connection_uri: str,
|
|
32
|
-
partition_on: str | None = None,
|
|
33
|
-
partition_range: tuple[int, int] | None = None,
|
|
34
|
-
partition_num: int | None = None,
|
|
35
|
-
protocol: str | None = None,
|
|
36
|
-
schema_overrides: SchemaDict | None = None,
|
|
37
|
-
pre_execution_query: str | list[str] | None = None,
|
|
38
|
-
) -> DataFrame:
|
|
39
|
-
cx = import_optional("connectorx")
|
|
40
|
-
|
|
41
|
-
if parse_version(cx.__version__) < (0, 4, 2):
|
|
42
|
-
if pre_execution_query:
|
|
43
|
-
msg = "'pre_execution_query' is only supported in connectorx version 0.4.2 or later"
|
|
44
|
-
raise ValueError(msg)
|
|
45
|
-
return_type = "arrow2"
|
|
46
|
-
pre_execution_args = {}
|
|
47
|
-
else:
|
|
48
|
-
return_type = "arrow"
|
|
49
|
-
pre_execution_args = {"pre_execution_query": pre_execution_query}
|
|
50
|
-
|
|
51
|
-
try:
|
|
52
|
-
tbl = cx.read_sql(
|
|
53
|
-
conn=connection_uri,
|
|
54
|
-
query=query,
|
|
55
|
-
return_type=return_type,
|
|
56
|
-
partition_on=partition_on,
|
|
57
|
-
partition_range=partition_range,
|
|
58
|
-
partition_num=partition_num,
|
|
59
|
-
protocol=protocol,
|
|
60
|
-
**pre_execution_args,
|
|
61
|
-
)
|
|
62
|
-
except BaseException as err:
|
|
63
|
-
# basic sanitisation of /user:pass/ credentials exposed in connectorx errs
|
|
64
|
-
errmsg = re.sub("://[^:]+:[^:]+@", "://***:***@", str(err))
|
|
65
|
-
raise type(err)(errmsg) from err
|
|
66
|
-
|
|
67
|
-
return from_arrow(tbl, schema_overrides=schema_overrides) # type: ignore[return-value]
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def _read_sql_adbc(
|
|
71
|
-
query: str,
|
|
72
|
-
connection_uri: str,
|
|
73
|
-
schema_overrides: SchemaDict | None,
|
|
74
|
-
execute_options: dict[str, Any] | None = None,
|
|
75
|
-
) -> DataFrame:
|
|
76
|
-
with _open_adbc_connection(connection_uri) as conn, conn.cursor() as cursor:
|
|
77
|
-
cursor.execute(query, **(execute_options or {}))
|
|
78
|
-
tbl = cursor.fetch_arrow_table()
|
|
79
|
-
return from_arrow(tbl, schema_overrides=schema_overrides) # type: ignore[return-value]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def _get_adbc_driver_name_from_uri(connection_uri: str) -> str:
|
|
83
|
-
driver_name = connection_uri.split(":", 1)[0].lower()
|
|
84
|
-
# map uri prefix to ADBC name when not 1:1
|
|
85
|
-
driver_suffix_map: dict[str, str] = {"postgres": "postgresql"}
|
|
86
|
-
return driver_suffix_map.get(driver_name, driver_name)
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
def _get_adbc_module_name_from_uri(connection_uri: str) -> str:
|
|
90
|
-
driver_name = _get_adbc_driver_name_from_uri(connection_uri)
|
|
91
|
-
return f"adbc_driver_{driver_name}"
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def _import_optional_adbc_driver(
|
|
95
|
-
module_name: str,
|
|
96
|
-
*,
|
|
97
|
-
dbapi_submodule: bool = True,
|
|
98
|
-
) -> Any:
|
|
99
|
-
# Always import top level module first. This will surface a better error for users
|
|
100
|
-
# if the module does not exist. It doesn't negatively impact performance given the
|
|
101
|
-
# dbapi submodule would also load it.
|
|
102
|
-
adbc_driver = import_optional(
|
|
103
|
-
module_name,
|
|
104
|
-
err_prefix="ADBC",
|
|
105
|
-
err_suffix="driver not detected",
|
|
106
|
-
install_message=(
|
|
107
|
-
"If ADBC supports this database, please run: pip install "
|
|
108
|
-
f"{module_name.replace('_', '-')}"
|
|
109
|
-
),
|
|
110
|
-
)
|
|
111
|
-
if not dbapi_submodule:
|
|
112
|
-
return adbc_driver
|
|
113
|
-
# Importing the dbapi without pyarrow before adbc_driver_manager 1.6.0
|
|
114
|
-
# raises ImportError: PyArrow is required for the DBAPI-compatible interface
|
|
115
|
-
# Use importlib.import_module because Polars' import_optional clobbers this error
|
|
116
|
-
try:
|
|
117
|
-
adbc_driver_dbapi = import_module(f"{module_name}.dbapi")
|
|
118
|
-
except ImportError as e:
|
|
119
|
-
if "PyArrow is required for the DBAPI-compatible interface" in (str(e)):
|
|
120
|
-
adbc_driver_manager = import_optional("adbc_driver_manager")
|
|
121
|
-
adbc_str_version = getattr(adbc_driver_manager, "__version__", "0.0")
|
|
122
|
-
|
|
123
|
-
msg = (
|
|
124
|
-
"pyarrow is required for adbc-driver-manager < 1.6.0, found "
|
|
125
|
-
f"{adbc_str_version}.\nEither upgrade `adbc-driver-manager` (suggested) or "
|
|
126
|
-
"install `pyarrow`"
|
|
127
|
-
)
|
|
128
|
-
raise ModuleUpgradeRequiredError(msg) from None
|
|
129
|
-
# if the error message was something different, re-raise it
|
|
130
|
-
raise
|
|
131
|
-
else:
|
|
132
|
-
return adbc_driver_dbapi
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def _open_adbc_connection(connection_uri: str) -> Any:
|
|
136
|
-
driver_name = _get_adbc_driver_name_from_uri(connection_uri)
|
|
137
|
-
module_name = _get_adbc_module_name_from_uri(connection_uri)
|
|
138
|
-
adbc_driver = _import_optional_adbc_driver(module_name)
|
|
139
|
-
|
|
140
|
-
# some backends require the driver name to be stripped from the URI
|
|
141
|
-
if driver_name in ("duckdb", "snowflake", "sqlite"):
|
|
142
|
-
connection_uri = re.sub(f"^{driver_name}:/{{,3}}", "", connection_uri)
|
|
143
|
-
|
|
144
|
-
return adbc_driver.connect(connection_uri)
|