0.5.3 (2021-04-16)


  • Ability to define an aggregated measure by combining multiple store columns. For example:

    - m["Quantity.SUM"] * m["Unit price.SUM"],
    + store["Quantity"] * store["Unit price"], # More efficient
      scope=tt.scope.origin(l["Sale ID"])
  • session.Session.security to configure roles and restrictions on a running session.

  • Glob pattern support in session.Session.read_parquet() and store.Store.load_parquet() methods.

  • config.create_logging_config to set the path of the file where the session logs are written.

User interface

  • Tree table widget.

    tree table widget

    The tree table is like a pivot table where the row headers are squashed into a single column displayed as a tree.

  • The Drillthrough context menu item already available in the app is also supported in JupyterLab.

    opening a drillthrough in JupyterLab

    Triggering the context menu of tables or charts from a selection with a single element allows to create a drillthrough widget that can be used to know the facts contributing to this aggregate.

  • The Convert to Widget Below JupyterLab command is also available on DataFrames returned by session.Session.query_mdx() and query.session.QuerySession.query_mdx().

  • Query editor drawer in the app to manipulate the MDX query of the selected widget.


  • DocSearch has been integrated to the docs to provide faster and better search results (#168).

  • The atoti-plus package has been restructured from a standalone package that could be installed instead of the atoti package to a plugin that can be installed alongside the atoti package.

  • Performance of store.Store.append() has been improved (#255).

  • Stores are no longer automatically partitioned.


  • Issue where uploading a file from the project root via the source simulation widget would cause it to be deleted when restarting the session (#253).

  • Issue with date columns when using SQL sources (#263).

  • value() correctly differentiates None due to different values and None due to missing data.


  • Creating roles with config.create_role().

  • Creating Basic authentication users with config.create_basic_user().

  • Creating Kerberos users with config.create_kerberos_user().

  • Displaying part of the logs with session.Session.logs_tail(). !tail -n 10 $session.logs_path can be used instead in Jupyter on Unix for example.