6.2.0b0
Released on Jul 03, 2026.Added
atoti.SessionConfig.base_path16.atoti_jdbc.JdbcLoad.error_handlingto control what happens when loading invalid rows 3.atoti.CsvLoad.error_handlingto control what happens when loading invalid rows 4.atoti.Cube.feedingandatoti.Session.create_cube()’s feeding parameter 13.atoti.aggregate_provider.aggregate_providers.AggregateProviders.recommenderto configure and retrieve AI-optimized aggregate provider recommendations based on the cube’s query history 14.- Atoti Intelligence can now be enabled without configuring an LLM provider 10.
Pass
AiConfigwith no arguments (leavingconnectionandchatasNone). AutoExplain still works but returns a default, non-AI summary, and the chat feature is disabled. Only theatoti[ai]extra is required — no provider extra is needed 10.
Changed
-
Bumped
atoti-jupyter’s minimum required JupyterLab version to 4.6.0. -
The default error handling for
atoti.CsvLoad.error_handlingandatoti_jdbc.JdbcLoad.error_handlingis now"fail"instead of"log"3 4. - Upgraded minimum Python required version to 3.12 as per NEP 29 11.
-
Upgraded minimum Pandas required version to 3.0.3 7.
Datetime and timedelta columns now use microsecond (
us) precision instead of nanosecond (ns) precision, both when loadingDataFrameobjects into Atoti and when query results are returned as DataFrames. Arrowlarge_stringcolumns are accepted on read in addition to the existingstringtype. -
atoti_ai_openai.ConnectionConfiggainedcustom_headers,max_retries, andtimeoutwhile losingproject_id.atoti_ai_openai.ChatConfiglostcompletions_path,http_headers, and itsretry_*attributes. The connection’sbase_urlmust now include the API path (such as/v1), and HTTP headers, retries, and timeouts are configured on the connection instead 6. -
When
AiConfigis set, the session’s MCP server now exposes an OAuth 2.1 flow by default, so MCP clients such as Claude Desktop or Claude Code can authenticate without a manually provisioned Bearer token. If the session delegates authentication to an OIDC provider (OidcConfig), the MCP server reuses it (externalmode: clients authenticate against that provider, which already guards the MCP endpoint). Otherwise the MCP server acts as its own OAuth 2.1 authorization server (self-issuedmode: a browser login and consent against the session’s own authentication). HTTP Basic authentication on the MCP endpoint keeps working, so programmatic and headless clients are unaffected. Override with theatoti.server.endpoint.mcp.oauth2.*server properties 5. -
Setting
atoti.Hierarchy.virtualtoTrueon an existing hierarchy is now applied at runtime 8. - Upgraded Atoti UI and Atoti Admin UI to 5.2.24.
-
The Atoti UI app is served in development mode if
__debug__isTrue. See deployment setup. -
AutoExplain and the chat feature are now provided by the new
atoti[ai]extra (backed by theatoti-client-aiandatoti-server-aipackages). They are no longer included in theatoti[ai-amazon-bedrock]andatoti[ai-openai]extras 10. Users who use AutoExplain or chat with a provider extra must also installai: -
atoti.AiConfighas moved toatoti_ai.AiConfig, provided by the newatoti-client-aipackage included in theatoti[ai]extra. TheChatConfigandConnectionConfigbase classes have moved fromatoti.config.aitoatoti_aias well 10. -
The
Parquet pluginis not installed by default anymore.
Deprecated
Removed
-
Publishing of Conda packages.
Install the Python packages with uv (or pip) instead.
It is still possible to use a Conda environment by installing the packages with
pip: -
atoti_directquery_databricks.ConnectionConfig.array_sum_agg_function_name,atoti_directquery_databricks.ConnectionConfig.array_long_agg_function_name,atoti_directquery_databricks.ConnectionConfig.array_short_agg_function_name, andatoti_directquery_databricks.ConnectionConfig.array_sum_product_agg_function_name. Spark UDAFs API has been deprecated as it is not recommended by Databricks anymore, use :mod:array conversion <atoti.directquery.array_conversion>instead 19. -
atoti_directquery_snowflake.ConnectionConfig.array_agg_wrapper_function_name. The built-in SnowflakeARRAY_AGGfunction is now faster, so the wrapper UDF is no longer needed 1. -
atoti.QueryCube.unload_members_from_data_cube. Member unloading from a query cube has been removed 9. -
Inferring the table name from the file path in
atoti.Session.read_csv(). Pass a table_name argument instead. -
The
atoti-aws,atoti-azure, andatoti-gcppackages (and theatoti[aws],atoti[azure], andatoti[gcp]extras). Installatoti-storage-aws,atoti-storage-azure, oratoti-storage-gcpinstead (i.e. replaceatoti[aws]withatoti[storage-aws],atoti[azure]withatoti[storage-azure], andatoti[gcp]withatoti[storage-gcp]). -
The
atoti-server-aws,atoti-server-azure, andatoti-server-gcppackages. Installatoti-server-storage-aws,atoti-server-storage-azure, oratoti-server-storage-gcpinstead. -
Table.columnsandExternalTable.columns. Uselist(table)instead. -
table.append(rows). Usetable.load(pd.DataFrame(rows, columns=list(table)))instead. -
The
Tabledata-loading shortcuts. Useatoti.Table.load()(oratoti.Table.stream()for Kafka) with the matching load/stream description instead:table.load_csv(path)→table.load(tt.CsvLoad(path))table.load_pandas(dataframe)→table.load(dataframe)table.load_arrow(arrow_table)→table.load(arrow_table)table.load_numpy(array)→table.load(pd.DataFrame(array, columns=list(table)))table.load_parquet(path)→table.load(atoti_parquet.ParquetLoad(path))table.load_spark(dataframe)→table.load(dataframe.toPandas())table.load_kafka(...)→table.stream(atoti_kafka.KafkaStream(...))table.load_sql(query)→table.load(atoti_jdbc.JdbcLoad(query))
-
Session.read_parquet(),Session.read_spark(),Session.read_numpy(), andSession.read_sql(). Useatoti.Session.create_table()together withatoti.Table.load()and the matching load description instead (e.g.atoti_parquet.ParquetLoadoratoti_jdbc.JdbcLoad); for Spark and NumPy, build apandas.DataFrameand useatoti.Session.read_pandas(). -
The
typesparameter ofatoti.Session.create_table(),read_csv(),read_pandas(), andread_arrow(). Use thedata_typesparameter instead. -
The
timeoutparameter ofatoti.Cube.query()andatoti.Session.query_mdx(). Pass aqueriesTimeLimitin thecontextargument instead. -
Hierarchy.levels. Iterate on the hierarchy instead. -
The
Hierarchy.visiblesetter. Useatoti.Hierarchy.viewersinstead. -
Deleting a
Level(del cube.levels[...]). Redefine itsHierarchyinstead. -
Cube.aggregates_cache. Useatoti.Cube.aggregate_cacheinstead. -
The
atoti.Measure.descriptiondeleter (del measure.description). Setmeasure.description = ""instead. -
Session.start_transaction(). Usesession.tables.data_transaction()instead. -
Session.port. Useatoti.Session.urlinstead (parsing it withurllib.parse.urlparse()if necessary). -
session.security.restrictions. Usesession.tables.restrictionsinstead. -
security.basic. Usebasic_authenticationinstead. -
The
methodparameter ofdate_shift(). Use itsfallbackparameter instead. -
The overload of
copy()takinghierarchy,member_paths, andconsolidation_factors. Usett.consolidate()instead. -
Importing
ParquetLoadfromatoti. Import it fromatoti_parquetinstead. -
The
copy_tutorialnotebook script. Follow the tutorial from the online documentation instead. -
The
atoti.pyapimodule. ImportRequest(previously exposed asHttpRequest) andatoti.Userdirectly instead. -
Leaving
username_case_conversionunset onatoti.LdapConfigandatoti.KerberosConfig. It is now required: pass"upper"or"lower". -
The deprecation warning emitted when
atoti.AggregateProvideris given multiple levels belonging to the same hierarchy. This misconfiguration now raises aValueError.
Fixed
- Creating a DirectQuery cube with
mode="no_measures"and afilterno longer sends unfilteredAPPROX_COUNT_DISTINCTqueries for virtual hierarchy detection. The cube filter is now applied to these statistics queries, preventing timeouts on large tables 12. LoggingCsvHealthEventHandlerno longer logs spurious errors when non-CSV health events are dispatched to it 15.JdbcPingDiscoveryProtocolbacked by an embedded H2 file database intermittently failing to form the cluster, because the query and data nodes, which run in separate JVMs, could not open the discovery database concurrently.AUTO_SERVER=TRUEis now enabled automatically for embedded H2 databases so that the query and data nodes can access the discovery table concurrently 17.
Security
- AWS S3: The commitment policy is now
REQUIRE_ENCRYPT_REQUIRE_DECRYPT, enforcing authenticated encryption for both reads and writes. Existing S3 data encrypted with older AWS encryption SDK clients (V1/V2) must be re-encrypted before upgrading 2.
Internal issue tracker references
- [1]
PIVOT-10231 - [2]
PIVOT-13185 - [3]
PIVOT-13841 - [4]
PIVOT-13961 - [5]
PIVOT-13970 - [6]
PIVOT-13976 - [7]
PYTHON-740 - [8]
PIVOT-14011 - [9]
PIVOT-14028 - [10]
PYTHON-859 - [11]
PYTHON-810 - [12]
PYTHON-869 - [13]
PYTHON-896 - [14]
PYTHON-668 - [15]
PYTHON-913 - [16]
PYTHON-917 - [17]
PYTHON-926
0.9.14
Released on April 17, 2026.Added
- OpenTelemetry spans around the main functions and methods of the library.
See
atoti_observabilityfor example traces.
Changed
- Upgraded Atoti Server to 6.1.19.
Deprecated
- atoti_directquery_databricks.ConnectionConfig.array_sum_agg_function_name, atoti_directquery_databricks.ConnectionConfig.array_long_agg_function_name, atoti_directquery_databricks.ConnectionConfig.array_short_agg_function_name, and atoti_directquery_databricks.ConnectionConfig.array_sum_product_agg_function_name.
Spark UDAFs API has been deprecated as it is not recommended by Databricks anymore, use
array conversioninstead 19.
Fixed
QueryCube’s hierarchies not beingvisibleby default. 18.ModuleNotFoundErrorraised byatoti-clientwhenatoti-client-parquetis not installed.
Internal issue tracker references
0.9.13
Released on March 10, 2026.Added
shift()’s mode parameter 21.- Documentation for
atoti-observability. - Documentation for the ROLE_MEASURE_LINEAGE role in
atoti.security.Security. atoti_jdbc.JdbcPingDiscoveryProtocol.update_store_on_view_change25.
Changed
- Upgraded Atoti Server to 6.1.18.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.20.
-
Renamed cloud storage packages:
atoti-client-aws→atoti-client-storage-awsatoti-server-aws→atoti-server-storage-awsatoti-client-azure→atoti-client-storage-azureatoti-server-azure→atoti-server-storage-azureatoti-client-gcp→atoti-client-storage-gcpatoti-server-gcp→atoti-server-storage-gcp
atoti_aws→atoti_storage_awsatoti_azure→atoti_storage_azureatoti_gcp→atoti_storage_gcp
Deprecated
atoti-client-aws,atoti-server-aws, and theatoti_awsmodule. Useatoti-client-storage-aws,atoti-server-storage-aws, andatoti_storage_awsinstead.atoti-client-azure,atoti-server-azure, and theatoti_azuremodule. Useatoti-client-storage-azure,atoti-server-storage-azure, andatoti_storage_azureinstead.atoti-client-gcp,atoti-server-gcp, and theatoti_gcpmodule. Useatoti-client-storage-gcp,atoti-server-storage-gcp, andatoti_storage_gcpinstead.
Fixed
NotImplementedErrorraised when creating a==condition on a column operation 23, 24.atoti.Column.data_typeandatoti.Column.default_valueraising an error when accessed on aconnected sessionusing the"Object"data type 20.- Setting MDX-related context values with
shared_contextnot being reflected in subsequent access toshared_contextin data cubes and raising an error in query cubes 22.
Internal issue tracker references
0.9.12
Released on January 23, 2026.Added
Changed
- Upgraded Atoti Server to 6.1.16.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.18.
-
Loading Apache Parquet files requires the new
atoti-client-parquetandatoti-server-parquetpackages 26. Installing theatotipackage also installs these packages but the next breaking release will make them opt-in.If you do no use Parquet files and wish to reduce the size of your dependencies, you can skip the installation of theatotipackage and manually install theatoti-clientandatoti-serverpackages instead:Or, if you use some extras:
Deprecated
-
atoti.ParquetLoad26. Useatoti_parquet.ParquetLoadinstead: -
Session.read_parquetsince support for Apache Parquet will become opt-in 26. Useinfer_data_types(),create_table(), andload()instead: -
atoti.Session.query_mdx()andatoti.Cube.query()’s timeout parameter 27. The default value has also been changed fromdatetime.timedelta(seconds=30)toNoneto automatically useshared_context’squeriesTimeLimit. Use the context parameter to specify a custom timeout:
Fixed
- Atoti Admin UI connecting to wrong server due to wrong order of WebJars in the server’s classpath 29.
- Hierarchies disappearing from the Data model tree when editing the data model of a
secured session28.
Internal issue tracker references
0.9.11
Released on December 16, 2025.Added
atoti.Hierarchy.description33.pandas<3.0.0rc0upper bound to avoid breaking changes from the new str dtype 35.
Changed
- Upgraded Atoti Server to 6.1.15.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.17.
-
atoti.Measure.descriptionreturns""instead ofNone33. -
Everything related to
Securityis kept in memory instead of being persisted in theuser_content_storage30. This makes the API more consistent since all the other methods onatoti.Sessionand its related classes never persisted their changes either. This improves performance, both when configuring these properties but also when executing queries.Basic authentication credentialsare unaffected since, for security reasons, they were already only kept in memory.
Deprecated
atoti.Measure.description’s deleter 33. Set the description to a blank string instead:
Fixed
- Data model search bar display issue in JupyterLab extension 36.
- Truncated response bodies when using
proxyorendpoint()31. This operation is not supported while batching mutationserror raised when requesting anendpoint()34.- Users configured through
basic_authenticationunable to connect whenthe configured LDAP serveris unreachable 32.
Internal issue tracker references
- [30]
PYTHON-716 - [31]
PYTHON-717 - [32]
PYTHON-728 - [33]
PYTHON-733 - [34]
PYTHON-737 - [35]
PYTHON-739 - [36]
PYTHON-745
0.9.10
Released on October 31, 2025.Added
- Support for Python 3.14 38.
- Dependencies page.
Changed
- Upgraded Atoti Server to 6.1.13.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.15.
- Installation instructions with Conda to recommend Miniforge over Anaconda’s installer to not be tied to Anaconda’s license requirements 39.
- Configuring
brandingdoes not remove the By ActiveViam signature at the bottom right corner of the app anymore. It is still possible to remove this signature through a customapp extension37.
Internal issue tracker references
0.9.9.2
Released on October 20, 2025.This version is not published on PyPI, it is only available on ActiveViam’s repository.
Added
- ROLE_ADMIN to
atoti.Hierarchy.viewers’s default value 41.
Changed
- Improved planning of MDX queries requesting many specific cells of the cube 40.
- Reduce number of requests made when
representing(or evaluating in a Jupyter notebook cell) cubes, levels, measures, etc of aconnected session42.
Fixed
SSL: CERTIFICATE_VERIFY_FAILEDerror when requesting a customendpoint()on aSessionconfigured withhttps43.
Internal issue tracker references
0.9.9.1
Released on September 30, 2025.This version is not published on PyPI, it is only available on ActiveViam’s repository.
Changed
- Improved planning of MDX queries requesting many specific cells of the cube 44.
Fixed
ArrayIndexOutOfBoundsExceptionwhen running some MDX queries 45.AssertionError: Output has already been setwhen deleting a cube 47.GraphQLClientGraphQLMultiError: Structural transaction must be committed by the thread starting itwhen settingatoti.Measure.visibleinside adata_model_transaction()46.
Internal issue tracker references
0.9.9
Released on September 22, 2025.Added
plugin_measure()53.atoti.Session.client51.Spring Boot Admin plugin48.atoti_directquery_snowflake.ConnectionConfig.main_warehouse_name49.
Changed
- Upgraded Atoti Server to 6.1.12.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.13.
-
Improved the logic used in
atoti.Session.linkandatoti.Session.widgetto find the URL from which theSessioncan be reached from the JupyterLab extension 50. For instance, if Jupyter Server is running at https://1.9.9.1:8888 and the Atoti session is running on the same machine but on port 1337, the browser will try to reach the session from https://1.9.9.1:1337.
Fixed
- Incorrect
MdxQueryResultwhen disabling light crossjoin 52. - Regression introduced in version 0.9.8 where
atoti.Session.endpointwould not handle URL encoded characters correctly 54. - Inability to use Basic Authentication in requests made to
custom endpointswhen the session is secured withOIDC55.
Internal issue tracker references
- [48]
PIVOT-12095 - [49]
PYTHON-592 - [50]
PYTHON-621 - [51]
PYTHON-629 - [52]
PYTHON-632 - [53]
PYTHON-634 - [54]
PYTHON-677 - [55]
PYTHON-678
0.9.8
Released on August 12, 2025.Added
Changed
- Upgraded Atoti Server to 6.1.11.
- When
atoti.JwtConfig.key_pairisNone, the automatically generated key pair will use 3072 bits instead of the old 2048 bits.
Deprecated
- Requests to endpoints created with
atoti.Session.endpointshould now use/proxyinstead of/atoti/pyapi./atoti/pyapiremains available but logs a warning when used 56. - The
atoti.pyapimodule is deprecated, import its classes directly fromatoti.Useroratoti.endpoint.Requestinstead 56.
Fixed
- Performance regression when editing measures inside a
data_model_transaction()57.
Internal issue tracker references
0.9.7
Released on July 01, 2025.Added
atoti.Hierarchy.viewers60.atoti.Hierarchy.folder61.atoti.SecurityConfig.cors59.atoti.finance.irr()’s period and guess parameters 64.
Changed
- Upgraded Atoti Server to 6.1.10.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.10.
atoti.AggregateProvider.measurescan be set toNoneto pre-aggregate all eligible measures 63.- Measures can no longer be defined in a data
Cubeonce it joined a distribution cluster. The measures must be defined before settingatoti.Session.clusters, or the session must be started withatoti.SessionConfig.readyset toFalsewithatoti.Session.readyset toTrueonly once all measures have been defined 58.
Deprecated
atoti.Hierarchy.visiblesetter 60. Useatoti.Hierarchy.viewersinstead:- Passing multiple levels of the same hierarchy to
atoti.AggregateProvider.levels. Only pass the deepest level instead: - Passing sequences to
atoti.AggregateProvider.levelsoratoti.AggregateProvider.measures. Pass sets instead:
Fixed
where()rejecting condition if it contained a~hierarchy.isin(...)or~level.isin(...)leaf 62.atoti.finance.irr()returningnanwhen the actual rate was too large 64.
Internal issue tracker references
- [58]
PIVOT-11612 - [59]
PIVOT-11652 - [60]
PYTHON-552 - [61]
PYTHON-593 - [62]
PYTHON-610 - [63]
PYTHON-615 - [64]
PYTHON-623
0.9.6
Released on May 17, 2025.Added
allow_data_duplicationandatoti.Session.create_cube()’s priority parameter 66.atoti.QueryCube.unload_members_from_data_cubeandatoti.Session.create_cube()’s id_in_cluster parameter 65.- Support for condition on hierarchy members (not only member paths) in
atoti.Cube.query()’s filter parameter 67. atoti.date_shift()’s dense parameter 71.experimental()context manager.
Changed
- Upgraded Atoti UI and Atoti Admin UI to 5.2.8.
- Upgraded Atoti Server to 6.1.8.
- The functions that were in the
atoti.experimentalsubpackage have been moved outside of it and require passing their feature key toexperimental():
Deprecated
- Deleting a level through
atoti.Cube.levels. Redefine its hierarchy instead: atoti.date_shift()’s method parameter 71. The new parameter name is fallback:
Fixed
- Display of join labels in
atoti.tables.Tables.schema69. atoti.where()’s returned measure evaluating incorrectly when using|within another condition 68.- Behavior of
get()when settingmapping_lookup()’s check toFalse. - Missing continuous query updates when using measures such as
atoti.agg.sum()withCumulativeScope70.
Internal issue tracker references
- [65]
PYTHON-538 - [66]
PYTHON-542 - [67]
PYTHON-554 - [68]
PYTHON-581 - [69]
PYTHON-584 - [70]
PYTHON-586 - [71]
PYTHON-591
0.9.5
Released on April 4, 2025.Security
SSO
Theatoti.KerberosConfig.username_case_conversion and atoti.LdapConfig.username_case_conversion attributes have been added to coerce the name of users logging in to the expected case 72.
Not picking a case conversion is a source of confusion or bugs so leaving these attributes unset will raise a deprecation warning.
Database access
atoti.tables.Tables.owners and atoti.tables.Tables.readers have been added 73.
Their impact is not limited to the Python API.
For instance, atoti.tables.Tables.readers will also control whether end users are able to see tables in Atoti Admin UI Database tab.
Dependencies
Fixed
Data loading
Cloud storage
On Windows, passing a URL toatoti.CsvLoad.path or atoti_parquet.ParquetLoad.path raised an InvalidPathException 77.
Data modeling
Conditions
Creating logical conditions (i.e. boolean combinations of leaf conditions such as(level["Product"] == "Phone") | (level["Country"] == "Portugal")) with more than 508 leaves raised a ValidationError because it reached the maximum nesting depth supported by the runtime type checker 78.
This was fixed by allowing the internal representation of a logical condition to group more than 2 operands.
For example, (a & b) | c | d | f | g (with a maximum depth of 2) replaces the old internal representation (((a & b) | c) | (d | f)) | g (with a maximum depth of 4).
Table columns
Columns are strictly typed: a column with a "LocalDate" data_type can only store dates (or None if its default_value is None); it cannot store a "String" such as "NaN".
Since Java has no equivalent of pandas.NaT, the only available values to represent a special null-restricted:
"LocalDate"areLocalDate.MINandLocalDate.MAX,"LocalDateTime"areLocalDateTime.MINandLocalDateTime.MAX.
default_value when it was set to one of these values raised a ValidationError 74.
This is fixed.
Measures
-
The type annotation of
filter()’s filter parameter never allowed invertedatoti.Level.isin()conditions (e.g.~level.isin("foo", "bar")) but, by chance, these conditions actually behaved as expected at runtime. However, 0.9.4 introduced runtime validation of condition types which lead to the rejection of these conditions. This regression is fixed: the type annotation of filter accepts these conditions and they are supported at runtime 75. -
Passing
isnullconditions toatoti.where()raised anUnknownUnderlyingMeasureRuntimeException76.
Internal issue tracker references
- [72]
PIVOT-11110 - [73]
PYTHON-528 - [74]
PYTHON-529 - [75]
PYTHON-534 - [76]
PYTHON-536 - [77]
PYTHON-539 - [78]
PYTHON-548
0.9.4
Released on February 28, 2025.Distribution
The nameQuerySession, unused since 0.9.0, makes a come back in this release but, this time, with a different meaning.
QuerySession becomes the entry point to create clusters of Atoti applications 84.
atoti.Cube.restrictions has been introduced to secure query sessions.
For the sake of symmetry, atoti.Session.security.restrictions has moved to atoti.tables.Tables.restrictions (the old location remains available but is deprecated).
See Scaling with distribution.
Performance
Client/server communication
Most components ofSession are exposed through mappings such as Cubes or Tables.
As a project grows, a lot of mapping lookups will be made to iteratively define the data model or to pass arguments to methods such as atoti.Cube.query().
For instance, the following code will make 3 lookups:
mapping_lookup() allows skipping these server requests.
Cube queries
The aggregate cache of a cube can be restricted to a subset of measures 81. This improvement comes with a newatoti.Cube.aggregate_cache API deprecating the previous atoti.Cube.aggregates_cache (with an “s”) one:
Hierarchy creation
Creating hierarchies from columns of a table fully joined (i.e. all their keys are mapped) to the cube’s fact table do not require “rebuilding” the cube anymore 82. This means that no time will be lost reindexing hierarchies or performing other expensive computations.Data modeling
Measures
atoti.where() was not respecting the order of condition_to_value when the same value was assigned to multiple conditions 80.
For example, in:
-1 because the first and last conditions, being both assigned to the same value, were merged together and that merged condition became the first one evaluating to True.
This incorrect merging of conditions has been removed: m["8"] >= 5 is correctly detected as the first condition evaluating to True and so Test is equal to 1.
Table columns
Columns with an arrray data type can be made non-nullable.atoti.Column.default_value’s documentation has been updated accordingly.
Data loading
Transactions
data_transaction()’s tables parameter allows some data transactions to execute concurrently 79.
CSV
Theatoti.CsvLoad.true_values and atoti.CsvLoad.false_values attributes can be configured to parse more values than "True", "true", "False", and "false" as "boolean" 83.
Dependencies
Internal issue tracker references
0.9.3
Released on January 13, 2025.Added
Changed
- Upgraded Atoti Server to 6.1.3.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.4.
SessionConfigand its inner classes validate that passedPathattributes exist. It prevents situations such as passing a path containing a typo toextra_jarsand being confused that the JAR’s classes still cannot be loaded.
Fixed
Session.read_parquetandParquetLoadnot being able to load Parquet files with extension other than.parquet.NullPointerExceptionreturned by the server when executing some MDX queries.
0.9.2
Released on December 05, 2024.Added
infer_data_types(),load(), andload_async()methods. Combined with the existingcreate_table()anddata_transaction()methods, they form the preferred way to create tables and load data into them.atoti_jdbc.JdbcLoad.parametersto bind variables to queries and avoid SQL injection.- Runtime check that
atoti.OidcConfig.scopesincludes the required"openid"scope.
Documentation
- Pressing the
ykey after clicking on an anchor in a page under https://docs.activeviam.com/products/atoti/python-sdk/latest/ will permalink the URL by replacing latest with the corresponding version.
Changed
- Upgraded Atoti Server to 6.1.2.
- Upgraded Atoti UI and Atoti Admin UI to 5.2.3.
- To support remote clusters,
atoti.Session.read_spark()andatoti.Table.load_spark()convert the passed Spark DataFrame to an in-memory Pandas DataFrame instead of exporting it to a Parquet file.
Deprecated
atoti.Table.append():atoti.Table.load_arrow():atoti.Table.load_csv():atoti.Table.load_kafka():atoti.Table.load_numpy():atoti.Table.load_pandas():atoti.Table.load_parquet():atoti.Table.load_spark()atoti.Table.load_sql():atoti.Session.read_numpy():atoti.Session.read_spark():atoti.Session.read_sql():create_table(),read_arrow(),read_csv(),read_pandas(),Session.read_parquet’s types parameter. Use the data_types parameter instead.- Inference of
read_csv()andSession.read_parquet’s table_name parameter. Pass a table_name argument instead.
Fixed
RecursionErrorbeing raised when passing more than 296 cases towhere().KeyErrorbeing raised when using aLevelas a key inswitch()’s cases parameter.- Snapshotting of
widgetin JupyterLab >= 4.2 by setting windowingMode to"defer".
0.9.1
Released on October 18, 2024.Added
- Support for Live extension to
atoti.Session.connect().
Changed
Fixed
- Incorrect use of credentials when reading from S3 in
atoti-storage-aws. atoti.Cube.query()’s include_totals not including sub totals of multilevel slicing hierarchies.
0.9.0
Released on September 13, 2024.Added
-
atoti-directquery-jdbcto connect to an external database through JDBC. -
data_model_transaction(). Batching measure creation with a data model transaction has the same performance as usingMeasures.update()without being limited to independent measures:Data model transactions also replace the private API relying onatoti.MeasureMetadata: -
atoti_directquery_redshift.ConnectionConfig.connection_pool_size.
User interface
- Filters tool in the sidebar of the JupyterLab extension to see default filters.
Changed
Packaging
-
The
atotipackage and most of its plugins (e.g.atoti-aws,atoti-directquery-directquery,atoti-kafkaetc.) have been split intoatoti-client-*andatoti-server-*packages. Theatoti-client-*packages contain the Python code composing the API while theatoti-server-*packages mostly contain the JARs implementing the corresponding features. The advanced installation section explains the goal of this split. Theatotipackage still exists but has become empty, it is only there to provide a convenient way to install both client and server packages. For instance:-
pip install atotiwill install bothatoti-clientandatoti-server. It will actually also installjdk4py. Note:jdk4pyis not a dependency ofatoti-serverso that projects willing to use another JDK can avoid installingjdk4pyby dependending onatoti-clientandatoti-serverdirectly. -
pip install "atoti[aws]"will installatoti-client,atoti-aws-client,atoti-aws-server, andatoti-server. -
pip install "atoti[jupyterlab]"will installatoti-client,atoti-server, andatoti-jupyterlab(no client/server split for this package because it only contains frontend assets).
atotiand its AWS plugin is:conda install atoti atoti-client-aws atoti-server-aws. -
Session start and configuration
-
atoti.Session.__init__()has been replaced withatoti.Session.start()for symmetry withatoti.Session.connect()(the removed section gives more details about that latter method):The top-level config parameters have been grouped into aSessionConfigdataclass providing better error reporting and allowing code reuse: -
atoti.Session.__init__()’s authentication parameter has been replaced withatoti.SessionConfig.security: -
atoti.UserContentStorageConfighas been moved toatoti_jdbc.UserContentStorageConfig:It makes it obvious that storing user content in an external database requiresatoti-jdbcto be installed.
DirectQuery
-
DirectQuery
*ConnectionInfoand*TableOptionsclasses have been renamedConnectionConfigandTableConfig. -
The
cacheattribute controlling whether DirectQuery connections should use caching has been moved from the connection instance to the connection config: -
The
DatabricksConnectionInfo.heavy_load_urlattribute has been renamedfeeding_url.
Other
- Upgraded
jdk4pydependency to 21.0.4 which adds support for Linux Arm64. atoti_aws.AwsKeyPair,atoti_aws.AwsKmsConfig, andatoti_azure.AzureKeyPairhave been renamedKeyPair,KmsConfig, andKeyPair.- The
atoti-sqlpackage has been renamedatoti-jdbc. atoti.Session.explain_mdx_query()andatoti.Cube.explain_query()have been replaced with an explain parameter toatoti.Session.query_mdx()andatoti.Cube.query():atoti.Table.keysreturns atupleinstead of alist. It communicates that keys cannot be changed once the table exists.create_cube()’s base_table parameter has been renamed fact_table.
User interface
- Upgraded Atoti UI and Admin UI to 5.2.0.
Deprecated
-
atoti.Session.port. Useatoti.Session.urlinstead: -
atoti.Session.start_transaction(). Useatoti.tables.Tables.data_transaction()instead: -
atoti.Session.security.basic. Usebasic_authentication: -
atoti.Table.columnsandatoti.ExternalTable.columns. Uselist(table)to list column names andfor column_name in table: ...to iterate on column names: -
atoti.Hierarchy.levels. Iterate on theHierarchyinstead:
Removed
- Support for Java 17, 18, 19, and 20.
-
The
atoti-querypackage and itsQuerySessionclass. Useatoti.Session.connect()instead: -
atoti.Table.__len__(). It was ambiguous because it could be interpreted as counting either rows or columns. Instead, useatoti.Table.row_countto count rows andlen(list(table))to count columns:
Previously deprecated
- Support for Python 3.9.
- Support for pandas 1.
- Support for JupyterLab 3.
atoti.UserServiceClient.atoti.Cube.schema.- Support for passing an
inttoatoti.Table.load_kafka()’s batch_duration parameter. - Support for passing a
tupleas a case key toswitch(). - Variadic constructor of
OriginScope. - Support for calling
atoti.Session.link(). atoti.Session.visualize()andatoti.QuerySession.visualize().- Support for array constants mixing
intandfloatvalues. - Support for passing a
Setto:atoti.Session()’s extra_jars or java_options parametersatoti.Cube.query()’s levels parameteratoti.Cube.create_parameter_simulation()’s levels parameteratoti.Cube.create_parameter_hierarchy_from_members()’s members parameter
- Support for passing a
Sequenceto:- DirectQuery
TableConfigclasses’ clustering_columns attribute atoti.MultiColumnArrayConversion.column_prefixesatoti.MultiRowArrayConversion.array_columnsatoti.OidcConfig.roles_claimsatoti.OidcConfig.scopes
- DirectQuery
atoti.Session.security.users.atoti.Session.security.basic.usersandatoti.Session.security.basic.create_user().atoti.Session.security.rolesandatoti.Session.security.create_role().- In-place mutation of
atoti.Security.security.ldap.role_mappingandatoti.Security.security.oidc.role_mapping’s values. - In-place mutation of
atoti.Security.security.individual_roles’ values.