0.8.11 (April 04, 2024)#


  • Support for loading headerless CSV files with read_csv() and load_csv() by passing a Sequence to columns.

  • Support for passing a broader set of conditions to atoti.Cube.query() or atoti_query.QueryCube.query()’s filter parameter:

    • Conditions using inequality (e.g. filter=l["Year"] >= 2022)

    • Conditions on a deep level of a multilevel hierarchy (e.g. filter=l["Geography", "City"] == "Paris" where Geography’s levels could be Continent, Country, and City)

  • Support for passing Arrow tables containing pyarrow.decimal128() and pyarrow.decimal256() values to read_arrow() or load_arrow(). These decimal values are stored as DOUBLE in the corresponding Table.


  • Upgraded Atoti UI to 5.1.16 and Admin UI to 5.1.7.


  • Passing a tuple to one of the keys of switch()’s cases parameter. Pass a Set instead:

      m["Continent"] = tt.switch(
    -     ("Paris", "London"): "Europe",
    +     frozenset({"Paris", "London"}): "Europe",
          "Singapore": "Asia",
          "NYC": "North America",

    This will allow using tuple (or any Sequence) for INT_ARRAY, LONG_ARRAY, FLOAT_ARRAY, or DOUBLE_ARRAY constants in a future release.


  • KeyError: ‘formattedValue’ being raised by atoti.Session.query_mdx() or atoti_query.QuerySession.query_mdx() when explicitly omitting the FORMATTED_VALUE property in the passed mdx. When a cell does not have a FORMATTED_VALUE, its stringified VALUE will be used instead.

  • ValidationError being raised when setting a measure to infinity: m["Infinity"] = math.inf.