Skip to content

Commit afa9fb3

Browse files
committed
Cleanup backends some more
1 parent 930f24d commit afa9fb3

File tree

4 files changed

+25
-4
lines changed

4 files changed

+25
-4
lines changed

xarray/backends/memory.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import numpy as np
66

77
from xarray.backends.common import AbstractWritableDataStore
8+
from xarray.core import indexing
89
from xarray.core.variable import Variable
910

1011

@@ -24,7 +25,12 @@ def get_attrs(self):
2425
return self._attributes
2526

2627
def get_variables(self):
27-
return self._variables
28+
res = {}
29+
for k, v in self._variables.items():
30+
v = v.copy(deep=True)
31+
res[k] = v
32+
v._data = indexing.LazilyIndexedArray(v._data)
33+
return res
2834

2935
def get_dimensions(self):
3036
return {d: s for v in self._variables.values() for d, s in v.dims.items()}

xarray/backends/scipy_.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ def ds(self):
190190
def open_store_variable(self, name, var):
191191
return Variable(
192192
var.dimensions,
193+
# this backend always loads in to memory, so we don't wrap
194+
# with LazilyIndexedArray
193195
ScipyArrayWrapper(name, self),
194196
_decode_attrs(var._attributes),
195197
)

xarray/conventions.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
)
1919
from xarray.core.utils import emit_user_level_warning
2020
from xarray.core.variable import IndexVariable, Variable
21-
from xarray.namedarray.utils import is_duck_dask_array
21+
from xarray.namedarray.utils import is_duck_array
2222

2323
CF_RELATED_DATA = (
2424
"bounds",
@@ -248,7 +248,20 @@ def decode_cf_variable(
248248

249249
encoding.setdefault("dtype", original_dtype)
250250

251-
if not is_duck_dask_array(data):
251+
if (
252+
# we don't need to lazily index duck arrays
253+
not is_duck_array(data)
254+
# These arrays already support lazy indexing
255+
# OR for IndexingAdapters, it makes no sense to wrap them
256+
and not isinstance(data, indexing.ExplicitlyIndexedNDArrayMixin)
257+
):
258+
# this path applies to bare BackendArray objects.
259+
# It is not hit for any internal Xarray backend
260+
emit_user_level_warning(
261+
"The backend you are using has not explicitly supported lazy indexing with Xarray. "
262+
"Please ask the backend developers to support lazy loading by wrapping with LazilyIndexedArray. "
263+
"See https://docs.xarray.dev/en/stable/internals/how-to-add-new-backend.html#how-to-support-lazy-loading for more."
264+
)
252265
data = indexing.LazilyIndexedArray(data)
253266

254267
return Variable(dimensions, data, attributes, encoding=encoding, fastpath=True)

xarray/core/indexes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,7 +717,7 @@ def from_variables(
717717

718718
# preserve wrapped pd.Index (if any)
719719
# accessing `.data` can load data from disk, so we only access if needed
720-
data = var._data.array if hasattr(var._data, "array") else var.data
720+
data = var._data if isinstance(var._data, PandasIndexingAdapter) else var.data
721721
# multi-index level variable: get level index
722722
if isinstance(var._data, PandasMultiIndexingAdapter):
723723
level = var._data.level

0 commit comments

Comments
 (0)