Skip to content

Commit 3d6f2b1

Browse files
committed
Remove explicit cparams parameter from CTable.add_column; use spec for that.
1 parent 420b8bc commit 3d6f2b1

2 files changed

Lines changed: 31 additions & 21 deletions

File tree

src/blosc2/ctable.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3691,10 +3691,10 @@ def from_csv(
36913691
# ------------------------------------------------------------------
36923692

36933693
@staticmethod
3694-
def _column_spec_default_and_cparams(
3694+
def _column_spec_default_and_config(
36953695
spec_or_field: SchemaSpec | dataclasses.Field,
3696-
) -> tuple[SchemaSpec, Any, dict | None]:
3697-
"""Extract the schema spec, default and cparams for ``add_column()``."""
3696+
) -> tuple[SchemaSpec, Any, ColumnConfig]:
3697+
"""Extract the schema spec, default and storage config for ``add_column()``."""
36983698
if isinstance(spec_or_field, dataclasses.Field):
36993699
meta = get_blosc2_field_metadata(spec_or_field)
37003700
if meta is None:
@@ -3706,22 +3706,25 @@ def _column_spec_default_and_cparams(
37063706
default = spec_or_field.default_factory()
37073707
else:
37083708
default = MISSING
3709-
cparams = meta.get("cparams")
3709+
config = ColumnConfig(
3710+
cparams=meta.get("cparams"),
3711+
dparams=meta.get("dparams"),
3712+
chunks=meta.get("chunks"),
3713+
blocks=meta.get("blocks"),
3714+
)
37103715
else:
37113716
spec = spec_or_field
37123717
default = MISSING
3713-
cparams = None
3718+
config = ColumnConfig(cparams=None, dparams=None, chunks=None, blocks=None)
37143719

37153720
if not isinstance(spec, SchemaSpec):
37163721
raise TypeError(f"add_column() requires a SchemaSpec, got {type(spec)!r}.")
3717-
return spec, default, cparams
3722+
return spec, default, config
37183723

37193724
def add_column(
37203725
self,
37213726
name: str,
37223727
spec: SchemaSpec | dataclasses.Field,
3723-
*,
3724-
cparams: dict | None = None,
37253728
) -> None:
37263729
"""Add a new column filled from the default declared in *spec*.
37273730
@@ -3734,10 +3737,6 @@ def add_column(
37343737
descriptor such as ``b2.field(b2.int64(ge=0), default=0)``.
37353738
A default is required when the table already has live rows, so
37363739
those rows can be backfilled.
3737-
cparams:
3738-
Optional compression parameters for this column's NDArray. When
3739-
*spec* is a :func:`blosc2.field` descriptor, its compression
3740-
parameters are used unless this argument is provided.
37413740
37423741
Raises
37433742
------
@@ -3757,9 +3756,7 @@ def add_column(
37573756
if name in self._computed_cols:
37583757
raise ValueError(f"A computed column named {name!r} already exists.")
37593758

3760-
spec, default, field_cparams = self._column_spec_default_and_cparams(spec)
3761-
if cparams is None:
3762-
cparams = field_cparams
3759+
spec, default, column_config = self._column_spec_default_and_config(spec)
37633760

37643761
live_pos = np.where(self._valid_rows[:])[0]
37653762
if default is MISSING and len(live_pos) > 0:
@@ -3769,6 +3766,7 @@ def add_column(
37693766
)
37703767

37713768
compiled_col = self._compiled_column_from_spec(name, spec)
3769+
compiled_col.config = column_config
37723770
self._resolve_nullable_specs(
37733771
CompiledSchema(row_cls=None, columns=[compiled_col], columns_by_name={name: compiled_col}),
37743772
validate_column_null_values=False,
@@ -3777,7 +3775,13 @@ def add_column(
37773775

37783776
if self._is_varlen_scalar_column(compiled_col):
37793777
# Varlen scalar columns don't use fixed-width NDArray storage.
3780-
new_col = self._storage.create_varlen_scalar_column(name, spec=spec, cparams=cparams)
3778+
col_storage = self._resolve_column_storage(compiled_col, None, None)
3779+
new_col = self._storage.create_varlen_scalar_column(
3780+
name,
3781+
spec=spec,
3782+
cparams=col_storage.get("cparams"),
3783+
dparams=col_storage.get("dparams"),
3784+
)
37813785
for _ in live_pos:
37823786
new_col.append(default)
37833787
new_col.flush()
@@ -3798,20 +3802,20 @@ def add_column(
37983802

37993803
capacity = len(self._valid_rows)
38003804
default_chunks, default_blocks = compute_chunks_blocks((capacity,))
3805+
col_storage = self._resolve_column_storage(compiled_col, default_chunks, default_blocks)
38013806
new_col = self._storage.create_column(
38023807
name,
38033808
dtype=spec.dtype,
38043809
shape=(capacity,),
3805-
chunks=default_chunks,
3806-
blocks=default_blocks,
3807-
cparams=cparams,
3808-
dparams=None,
3810+
chunks=col_storage["chunks"],
3811+
blocks=col_storage["blocks"],
3812+
cparams=col_storage.get("cparams"),
3813+
dparams=col_storage.get("dparams"),
38093814
)
38103815
if len(live_pos) > 0:
38113816
new_col[live_pos] = default_val
38123817

38133818
compiled_col.default = default
3814-
compiled_col.config = ColumnConfig(cparams=cparams, dparams=None, chunks=None, blocks=None)
38153819
self._cols[name] = new_col
38163820
self.col_names.append(name)
38173821
self._col_widths[name] = max(len(name), compiled_col.display_width)

tests/ctable/test_schema_mutations.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,12 @@ def test_add_column_schema_updated():
240240
assert "weight" in t.schema.columns_by_name
241241

242242

243+
def test_add_column_uses_field_storage_config():
244+
t = CTable(Row, new_data=DATA10)
245+
t.add_column("weight", blosc2.field(blosc2.float64(), default=0.0, cparams={"clevel": 9}))
246+
assert t.column_schema("weight").config.cparams == {"clevel": 9}
247+
248+
243249
def test_add_column_persists_on_disk():
244250
path = table_path("add_col")
245251
t = CTable(Row, urlpath=path, mode="w", new_data=DATA10)

0 commit comments

Comments
 (0)