From 0368391a9fd16ec6323e87ecd7cfc9d3d9b82186 Mon Sep 17 00:00:00 2001 From: Sandor Kertesz Date: Wed, 12 Feb 2025 11:08:57 +0000 Subject: [PATCH] Fix max recursion depth exceeded when concatenate (#599) * Fix infinite recursion when concatenate --- docs/release_notes/version_0.12_updates.rst | 10 ++++++++++ src/earthkit/data/core/index.py | 9 ++++++++- tests/grib/test_grib_concat.py | 11 +++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/docs/release_notes/version_0.12_updates.rst b/docs/release_notes/version_0.12_updates.rst index 0b5bdf42..b7227abe 100644 --- a/docs/release_notes/version_0.12_updates.rst +++ b/docs/release_notes/version_0.12_updates.rst @@ -1,6 +1,16 @@ Version 0.12 Updates ///////////////////////// + +Version 0.12.2 +=============== + +Fixes +++++++++ + +- Fixed issue when failed to build a fieldlist with concatenation because maximum recursion depth exceeded (:pr:`599`) + + Version 0.12.1 =============== diff --git a/src/earthkit/data/core/index.py b/src/earthkit/data/core/index.py index 1d06524f..c13cf508 100644 --- a/src/earthkit/data/core/index.py +++ b/src/earthkit/data/core/index.py @@ -633,11 +633,18 @@ def __repr__(self): class MultiIndex(Index): def __init__(self, indexes, *args, **kwargs): - self._indexes = list(indexes) + self._indexes = list(self._flatten(indexes)) super().__init__(*args, **kwargs) # self.indexes = list(i for i in indexes if len(i)) # TODO: propagate index._init_args, index._init_order_by, index._init_kwargs, for each i in indexes? + def _flatten(self, indexes): + for i in indexes: + if isinstance(i, MultiIndex): + yield from self._flatten(i._indexes) + else: + yield i + def sel(self, *args, **kwargs): if not args and not kwargs: return self diff --git a/tests/grib/test_grib_concat.py b/tests/grib/test_grib_concat.py index 5c92f477..1e94e1dc 100644 --- a/tests/grib/test_grib_concat.py +++ b/tests/grib/test_grib_concat.py @@ -150,6 +150,17 @@ def test_grib_from_empty_3(): _check_save_to_disk(ds3, 8, md) +# See github issue #588 +def test_grib_concat_large(): + ds_e = from_source("empty") + ds1 = from_source("file", earthkit_examples_file("test.grib")) + + for _ in range(2000): + ds_e += ds1.sel(param="msl") + + assert len(ds_e) == 2000 + + if __name__ == "__main__": from earthkit.data.testing import main