Skip to main content

Migrate to 6.2

This page describes the best strategy to upgrade to 6.2. Read the Release notes to get familiar with major changes for this release. This guide refers to changes in migration order. The Release notes refers to the changes based on their importance or significance. For this migration, an automated OpenRewrite migration recipe is provided. Run it at the specified step of the migration process.

Packaging changes

All the artifacts are available on JFrog Artifactory. There are two client-facing entrypoints: Read the download page to see how to configure those entry points. The channel mvn includes mvn-prod and also includes pre-release (alpha, beta, milestone, release candidate) and continuous builds. Visibility of Maven artifacts depends on the access rights of the account. Some artifacts, such as continuous build, may not be accessible if the required permissions are not granted. Atoti is not distributed on artifacts.activeviam.com.

Preparatory work

  • Upgrade at least to version 6.1.20
  • Check for use of avinternal/internal/private_ in imports and replace them. Do not hesitate to fill a support ticket to seek for an alternative
  • Fix Spring deprecations, follow Spring guide
  • Try building the project with JDK 25. Some dependencies may require an upgrade for the build to succeed — for example, Lombok must be upgraded to a JDK 25-compatible version (1.18.40+).
  • Check for use of removed features

Upgrade

  • Run the automated OpenRewrite migration recipe
  • Update the poms to the new Java version, Spring Boot version and Atoti version
  • Atoti Server 6.2 moves to Spring Boot 4, which brings Jackson 3 (com.fasterxml.jackson.*tools.jackson.*). Migrate your Jackson usage with OpenRewrite’s UpgradeJackson_2_3 recipe. This recipe, together with the Spring Boot 4 one, can be combined with the Atoti migration recipe in the same OpenRewrite pass. This Jackson migration has a non-negligible impact if the project exposes its own REST services.
  • If you overrode the admin-ui.version Maven property to pin the Atoti Admin UI version, this property is removed: all Atoti UI artifacts (atoti-ui, atoti-ui-initial-content, atoti-admin-ui) are now versioned by the single atoti-ui.version property
  • Logging configuration: Atoti Server now emits its logs through SLF4J instead of JUL.
    • The org.slf4j:jul-to-slf4j bridge is no longer required to capture Atoti Server logs. Keep it only if third-party dependencies still log through JUL and you want those logs routed to SLF4J.
    • To route logging through JUL, add a runtime dependency on org.slf4j:slf4j-jdk14.
    • See the SLF4J documentation to redirect logs to your preferred logging framework.
  • Compile and test
If the code does not compile automatically after these steps, please file a ticket with the code that failed to be migrated, as it should have been handled by the migration recipes.

Automated OpenRewrite migration recipe

The automated OpenRewrite migration recipe handles the following API changes from 6.1.20 to 6.2.0. Run it during the Upgrade step. The recipe is published to JFrog as the artifact com.activeviam.migration:6_1_20-to-6_2_0:<version>, where <version> should be replaced with the latest available version from JFrog.

How to run

From your project root, preview the changes first:
Then apply them by replacing dryRun with run
Use rewrite-maven-plugin version 6.43.0 or later. Older versions bundle an OpenRewrite version that cannot parse Java 25 sources: parsing fails for every file, so the Java recipes match nothing and are silently skipped, while only the POM changes are applied. The build still reports BUILD SUCCESS.

Combining with the Spring Boot 4 and Jackson 3 migrations

Since the 6.2 upgrade also involves migrating to Spring Boot 4 (which includes the Spring Framework 7 migration) and Jackson 3, the Atoti recipe can be combined with OpenRewrite’s community recipes UpgradeSpringBoot_4_0 and UpgradeJackson_2_3 into a single pass:
As with the single-recipe command, replace run with dryRun to preview the changes. rewrite-jackson:1.26.0 and rewrite-spring:6.34.0 are the current latest version at the time of writing

Running a subset of the migration

The aggregator recipe com.activeviam.migration.v6_1_20_to_6_2_0 runs everything. Each migration is split into three phases so you can adopt it gradually. Swap -Drewrite.activeRecipes= for one of the phase recipes instead of the aggregator:

Manual changes

The following changes are not handled by the automated recipe and must be applied manually.
  • The misspelled ActiveViamProperty.THROW_ON_MISSING_DATA_NODE_REPONSE constant has been renamed to THROW_ON_MISSING_DATA_NODE_RESPONSE. Both map to the same activeviam.distribution.query.throwOnMissingResponse property key, so only code referencing the Java constant needs updating. Property removals and renames are listed under Property changes below.
  • IActivePivotContentServiceConfig is deprecated. If you implement this interface, the @Bean annotation is not inherited from the interface for activePivotContentService(). Add @Bean explicitly to your implementing method, or migrate to declaring IActivePivotContentService as a standalone @Bean.
  • ICsvParserConfigPolicy, LineAndFileLimitCsvParserPolicy, and NoRestrictionCsvParserConfigPolicy have been removed from the CSV source API, along with CsvParserConfiguration.getParserPolicy() and setParserPolicy(). These APIs allowed limiting the number of lines or files read and sampling rows with a step; this functionality has been removed with no replacement. Remove any reference to these types and methods.
  • IParquetReaderPolicy and IParquetParserBuilder.withPolicy(IParquetReaderPolicy) have been removed from the Parquet source API. These APIs allowed limiting the number of lines or files read and sampling rows with a step; this functionality has been removed with no replacement. Remove any reference to this type.
  • SnowflakeDatabaseSettings.lastAlteredMargin has been removed. A recently-altered table is now read at the Snowflake CURRENT_TIMESTAMP sampled when the version is built instead of at its (possibly lagging) LAST_ALTERED.
  • Range sharing can now be configured only through the IQueryExecution context value:
    • Default behavior — add a QueryExecution context value to the cube’s shared context with withSharedContextValue(QueryExecution.builder().rangeSharingEnabled(false).build()).
    • Per-query behavior — include the same QueryExecution context value in the query’s context values.
  • IActivePivotManagerDescriptionConfig is deprecated. If you implement this interface, remove implements IActivePivotManagerDescriptionConfig from your class declaration and add @Bean explicitly to your managerDescription() method. If you relied on the default epochManagementPolicy() provided by the interface, it is no longer needed: the default KeepLastEpochPolicy is applied automatically. To use a custom policy, declare an IEpochManagementPolicy @Bean in your configuration.
  • IDatastoreConfig is deprecated. If you implement this interface, remove implements IDatastoreConfig from your class declaration and add @Bean @DependsOn("poolsCleaner") explicitly to your database() method. If you are using the Atoti Spring Boot starter, poolsCleaner is provided automatically by AtotiSystemAutoConfiguration — no further changes are needed. Otherwise, also copy the poolsCleaner bean into your configuration class:
  • IRoleContextConfig is deprecated. If you implement this interface, remove implements IRoleContextConfig from your class declaration and add @Bean explicitly to your entitlementsProvider() method.
  • IDatastoreSchemaDescriptionConfig is deprecated. If you implement this interface, remove implements IDatastoreSchemaDescriptionConfig from your class declaration and add @Bean explicitly to your datastoreSchemaDescription() method.
  • IParameterAwareDatastoreSchemaDescriptionConfig is deprecated. If you implement this interface, remove implements IParameterAwareDatastoreSchemaDescriptionConfig from your class declaration and add @Bean explicitly to your datastoreSchemaDescription() and parameterStoreConfiguration() methods. The bean Collection<UnaryOperator<IDatastoreSchemaDescription>> descriptionTransformations() has been deleted. If you had custom transformations, those should be applied when implementing the IDatastoreSchemaDescription datastoreSchemaDescription() bean.
  • Several methods of the Datastore transaction API (package com.activeviam.database.datastore.api.transaction) no longer declare throws DatastoreTransactionException, because they could never actually throw it. The affected methods are:
    • ITransactionalWriter#remove(String, Object...)
    • ITransactionalWriter#removeAll(String, Collection)
    • IOpenedTransaction#updateWhere(ISelection, ICondition, IUpdateWhereProcedure)
    • IOpenedTransaction#rollback()
    • ITransactionManager#rollbackTransaction()
    • ITransactionManager#stop()
    Since DatastoreTransactionException is a checked exception, a try block wrapping only calls to these methods with a catch (DatastoreTransactionException e) clause will no longer compile. Remove the now-dead catch clause, or the entire try if it was the only catch. In a multi-catch such as catch (DatastoreTransactionException | SomeOtherException e), remove only the DatastoreTransactionException alternative. Methods that still throw it, such as commitTransaction(), startTransaction(...) and removeWhere(...), are unaffected, so a catch that also wraps one of those stays as-is.
  • The String-based distributing level APIs have been removed. Replace usages as follows, converting each former String level name to a LevelIdentifier (constructed with dimension name, hierarchy name, and level name):
    • IApplicationDescriptionBuilderWithId#withDistributingFields(String...)withDistributingLevels(LevelIdentifier...)
    • QueryClusterDefinition.DistributedApplicationDefinition(String, List<String>)QueryClusterDefinition.DistributedApplicationDefinition(String, List<LevelIdentifier>)
  • IDistributedApplicationDefinition#getDistributingFields() has been removed. Use getDistributingLevels() instead, which returns a List<LevelIdentifier>.
  • com.activeviam.database.api.schema.DataTable has been removed. This change is not handled by the automated migration recipe — replace constructor calls manually with the description API matching your stack:
    • Datastore tables: new DataTable(name, keyFieldNames, fields) becomes StoreDescription.simpleBuilder().name(name).keyFieldNames(keyFieldNames).fields(fields).build(). The fields list should now contain IFieldDescription instances (from com.activeviam.database.datastore.api.description) instead of IDataTableField. Replace new DataTableField(...) with FieldDescription.builder()…build() from the same package.
    • DirectQuery tables: new DataTable(name, keyFieldNames, fields) becomes TableDescription.builder().externalTable(...).withSameLocalName().fields(fields).keyFieldNames(keyFieldNames).build(), supplying the appropriate ExternalTable. The fields list should now contain AFieldDescription instances (from com.activeviam.directquery.api.schema) instead of IDataTableField. Replace new DataTableField(...) with FieldDescription.builder()…build() from the same package.
  • IActivePivotBranchPermissionsManagerConfig has been deprecated and no longer carries @Configuration or @Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and expose IBranchPermissionsManager as a @Bean from a @Configuration class directly.
  • IActivePivotConfig has been deprecated and no longer carries @Configuration or @Bean. Implementing it no longer exposes a branch permissions manager bean. Stop implementing this interface and expose IActivePivotManager as a @Bean from a @Configuration class directly.
  • The JwtAuthenticationProvider bean exposed by the JWT configuration is no longer @Primary. Previously, injecting the bare AuthenticationProvider type while several AuthenticationProvider beans existed (for example the JWT provider plus an in-memory DaoAuthenticationProvider) silently resolved to the JWT provider, even when the parameter name matched another bean — which could break username/password authentication built on such an injection. Now the injection resolves by parameter name, or fails at startup with NoUniqueBeanDefinitionException when no bean matches the parameter name. If your configuration relied on the JWT provider being primary, disambiguate explicitly: inject the concrete JwtAuthenticationProvider type, or add @Qualifier("jwtAuthenticationProvider") on the injection point.
  • MapGetAggregatesQuery and MapDrillthroughQuery now always convert to the built-in GetAggregatesQuery and DrillthroughQuery implementations. It is no longer possible to use a custom implementation registered under IGetAggregatesQuery.PLUGIN_KEY or IDrillthroughQuery.PLUGIN_KEY.
  • Conditions (package com.activeviam.tech.core.api.filtering) are no longer extended-plugin values:
    • ILogicalCondition and IMatchingCondition no longer extend IExtendedPluginValue, so the plugin-1ey constants and the getType() method are removed from all conditions.
    • Instantiate conditions directly with their public constructors instead of going through the registry:
      • Registry.getExtendedPlugin(IMatchingCondition.class).valueOf(IMatchingCondition.EQUAL).create(value)new EqualCondition(value)
      • Registry.getExtendedPlugin(IMatchingCondition.class).valueOf(IMatchingCondition.IN).create(values)new InCondition(values)
      • Registry.getExtendedPluginValue(ILogicalCondition.class, ILogicalCondition.AND).create(conditions)new AndCondition(conditions)
    • Replace getType() string comparisons with instanceof/pattern matching on the concrete condition class, e.g. condition.getType().equals(ILogicalCondition.AND)condition instanceof AndCondition.
  • ClickhouseProperties has been removed. Use ClickhousePropertiesV2 instead, as the ClickHouse connector has been upgraded to use a new client. There is no recipe to automatically build the new properties.
  • IContextualQuery, IListQuery, IStringQuery and AListQuery have been moved to an internal package. There should be no need to migrate customer code unless you were directly importing or subclassing these types, which is an unsupported pattern.
  • IContinuousQueryListener, IContinuousQueryUpdate, IVersionedContinuousQueryUpdate and IActivePivotContinuousQuery have been moved to an internal package. Use the specialized interfaces instead:
    • IGetAggregatesContinuousQuery or IDrillthroughContinuousQuery
    • IGetAggregatesContinuousQueryListener or IDrillthroughContinuousQueryListener
    • IGetAggregatesUpdate or IDrillthroughUpdate
  • Method IContinuouslyQueryable#registerContinuousQuery has been moved to IMultiVersionActivePivot#registerContinuousQuery and specialized in the following 2 variants:
    • IMultiVersionActivePivot#registerContinuousQuery(String, GetAggregatesQuery, Properties, Collection<? extends IGetAggregatesContinuousQueryListener>)
    • IMultiVersionActivePivot#registerContinuousQuery(String, DrillthroughQuery, Properties, Collection<? extends IDrillthroughContinuousQueryListener>)
  • The deprecated class com.activeviam.tech.core.api.tracking.Tracing has been removed.
  • The Netty max message size property (nettyMessageMaxSize) and the setMaxSizeForMessage MBean operation no longer accept fully-qualified class names. Replace any class name with the matching public message-type keyword listed in NettyMessageType. An unknown key now raises a configuration error.
  • CubeFilter.getSubCubeFromContext(IContext) has been removed. Use CubeFilter.getSecurityAndFilter(IContext) instead.
  • CubeFilter.intersectWithSecurity(ICubeFilter, IContext) has been removed. There is no public replacement for this method.
  • IQueriesService.execute() method has been changed to use the query concrete classes:
    • execute(IMDXQuery) -> execute(MdxQuery).
    • execute(IGetAggregatesQuery) -> execute(GetAggregatesQuery, String).
    • execute(IMapGetAggregatesQuery) -> execute(MapGetAggregatesQuery, String).
    • execute(IDrillthroughHeadersQuery) -> execute(DrillthroughHeadersQuery, String).
    • execute(IMDXDrillthroughHeadersQuery) -> execute(MdxDrillthroughHeadersQuery).
    • execute(IDrillthroughQuery) -> execute(DrillthroughQuery, String).
    • execute(IMapDrillthroughQuery) -> execute(MapDrillthroughQuery, String).
    • execute(IMDXDrillthroughQuery) -> execute(MdxDrillthroughQuery).
  • The generic IStreamingService.createStream() method has been split into different methods to use the query concrete classes:
    • createStream(MdxQuery, IStreamProperties).
    • createStream(MdxDrillthroughQuery, IStreamProperties).
    • createStream(GetAggregatesQuery, String, IStreamProperties).
    • createStream(DrillthroughQuery, String, IStreamProperties).
    • createStream(MapGetAggregatesQuery, String, IStreamProperties).
    • createStream(MapDrillthroughQuery, String, IStreamProperties).
  • The generic IStreamingService.updateStreamQuery() method has been split into different methods to use the query concrete classes:
    • updateStreamQuery(String, String, MdxQuery).
    • updateStreamQuery(String, String, MdxDrillthroughQuery).
    • updateStreamQuery(String, String, GetAggregatesQuery).
    • updateStreamQuery(String, String, DrillthroughQuery).
    • updateStreamQuery(String, String, MapGetAggregatesQuery).
    • updateStreamQuery(String, String, MapDrillthroughQuery).
  • The interfaces IQuery and IContinuousQuery are no longer generic.
  • IMember#getHierarchyInfo() and IMember#getLevelInfo() are deprecated since 6.2.0 and planned for removal in 6.3.0.
  • To replace getHierarchyInfo(): use getLevelIdentifier() and navigate via LevelIdentifier#getHierarchy() when only an identifier is needed. When full hierarchy metadata is required, look up the hierarchy directly through the cube’s hierarchies.
  • To replace getLevelInfo(): use narrower accessors when only a single attribute is needed. For example, replace getLevelInfo().getOrdinal() with IAxisMember#getLevelOrdinal(), or use getLevelIdentifier() to identify the level. When full level metadata is required, look up the level directly through the cube’s hierarchies.
  • The starter-ai-mcp-server now defaults the MCP transport to Streamable HTTP (spring.ai.mcp.server.protocol=STREAMABLE, served at POST /mcp) instead of the previous Server-Sent Events transport (/sse plus /mcp/messages). This aligns with the MCP specification’s move to Streamable HTTP and is required by current MCP clients such as Claude Code. If you rely on the SSE transport, restore it explicitly:
  • The "NaturalOrder" (and "ReverseOrder") comparator now truly sorts using natural order: embedded digit sequences are compared numerically rather than character by character, so "file1" < "file2" < "file10". Previously, "NaturalOrder" sorted strings purely character by character ("file1" < "file10" < "file2"), despite its name. If your configuration relies on that previous character-by-character behavior, switch to "LexicographicalOrder" (or "ReverseLexicographicalOrder" for descending), which keeps sorting "file1" < "file10" < "file2". Levels with no explicit comparator default to "LexicographicalOrder", so this default behavior is unaffected by this change.
  • The Dremio DirectQuery connector’s Flight SQL JDBC driver now bundles Netty 4.2 (previously 4.1), following the upgrade to Arrow 19.0.0. On JDK 25 and later, Netty 4.2 disables its sun.misc.Unsafe based off-heap memory access by default (part of the JEP 498 deprecation), so its allocator can no longer initialize. If you use the Dremio connector, add --sun-misc-unsafe-memory-access=allow to your server’s JVM options.

Property changes

The following configuration properties changed in 6.2.0. Where a property was also exposed as an ActiveViamProperty constant, that constant has been removed too. Atoti logs a startup warning for the legacy activeviam.* properties it recognizes as removed or renamed, so review your startup logs after upgrading (see Post-upgrade).

Change of behavior

  • Applications built on the Atoti Spring Boot starter no longer expose the legacy ActivePivot services IAdministrationService and ILicensingService as Spring beans. These services mirror the payloads of the removed SOAP web services, and their information is available through the REST APIs. If your application still injects them, set the atoti.server.service.legacy.enabled property to true to restore them, and please share your use case with ActiveViam: these services are planned for removal in a future version.
  • The query-service monitoring previously provided by the APM module is now built into Atoti Server: query counters are always recorded, and exceptions thrown during query processing are always logged. The single name=QueriesService,type=Monitoring MBean previously registered by the APM module is replaced by two MBeans: name=QueriesServiceStatistics,type=Monitoring (query counters) and name=QueriesServiceLogging,type=Monitoring (runtime logging toggles). The per-query report logs (query/result description, completion time, optional memory statistics) are now disabled by default. If you relied on the APM module to produce these logs, enable them with the atoti.server.query.service.logging=true application property (and optionally atoti.server.query.service.detailed-logging and atoti.server.query.service.log-memory-stats), or at runtime through the QueriesServiceLogging MBean. These logs are now emitted on the atoti.server.query.service logger.
  • Similarly, the JSON queries-service monitoring previously provided by the APM module is now built into Atoti Server: query counters are always recorded, and exceptions thrown during query processing are always logged. The name=JsonQueriesService,type=Monitoring MBean previously registered by the APM module is replaced by name=JsonQueriesServiceStatistics,type=Monitoring (query counters) and name=JsonQueriesServiceLogging,type=Monitoring (runtime logging toggles). The per-query report logs are disabled by default; enable them with the atoti.server.query.service.json.logging=true application property (and optionally atoti.server.query.service.json.detailed-logging and atoti.server.query.service.json.log-memory-stats), or at runtime through the JsonQueriesServiceLogging MBean. The total query counters now correctly include drillthrough queries, which were previously omitted from the totals. These logs are now emitted on the atoti.server.query.service.json logger.
  • Similarly, the streaming-service monitoring previously provided by the APM module is now built into Atoti Server: stream counters are always recorded, and exceptions thrown during stream processing are always logged. The per-query report logs are now disabled by default — note that the APM module previously enabled them by default (activeviam.apm.enable.streaming.service.logging defaulted to true). If you relied on the APM module to produce these logs, enable them with the atoti.server.query.service.streaming.logging=true application property (and optionally atoti.server.query.service.streaming.detailed-logging and atoti.server.query.service.streaming.log-memory-stats), or at runtime through StreamingQueriesServiceLogging MBean. The streaming statistics counters are exposed through the new name=StreamingQueriesServiceStatistics,type=Monitoring MBean. These logs are now emitted on the atoti.server.query.service.streaming logger.
  • The query performance evaluator (adaptive slow-query detection) previously provided by the APM module has been removed: its role is superseded by OpenTelemetry traces and metrics together with the query history module. The query executor performs the (OpenTelemetry-native) monitoring. The activeviam.apm.query.performance.evaluation.{min.sample.size,max.sample.size,coefficient} configuration properties and the com.activeviam.apm.query.slow slow-query logger no longer exist; remove any references to them from your configuration.
  • The APM startup configuration dump has been removed. When the com.activeviam.apm.spring logger was set to DEBUG, the APM module used to log every resolved Spring environment property at startup along with the application classpath. Use Spring Boot’s built-in equivalents instead: the Actuator env and configprops endpoints expose the resolved configuration and sanitize sensitive values out of the box, and starting the application with --debug prints the auto-configuration report.
  • The XMLA monitoring JMX MBean has been renamed from XmlaAPMonitoring to XmlaMonitoring. Update any JMX client, script, or dashboard that references the MBean by name.
  • The node-instance-name logging property has been renamed from activeviam.apm.node.instance.name to atoti.server.node.instance.name, and its default value changed from activepivot to atoti. This property sets the node name shown for the source of each log line (through the LogInstanceConverter Logback converter). Deployments that set the old property must move it to the new key; deployments relying on the default will see the logged node name change from activepivot to atoti.
  • The apm module has been removed; its remaining function is now built into Atoti Server (wired by the atoti-server-starter and the observability plugin). Three behavior changes follow:
    • Thread-status monitoring. The former ThreadsStatusMonitoringBean and its name=ThreadStatus,type=Monitoring JMX MBean (which exposed running/blocked/waiting thread counts) have been removed. Per-state thread counts are available from the standard JVM java.lang:type=Threading MBean or from Micrometer’s JvmThreadMetrics. The passive blocked-thread detection it performed is preserved as a watchdog that logs a full thread dump (built from ThreadDumpUtils) when blocked threads are detected. The watchdog is now disabled by default because the dumps can be verbose; opt in with atoti.server.monitoring.blockedThreadWatchdog.enabled=true. Its scan interval is atoti.server.monitoring.blockedThreadWatchdog.scanIntervalMs (replacing activeviam.apm.jmx.thread.status.cache.timeout). The activeviam.apm.node.starter.jmx.enabled starter property, which used to gate the now-removed JMX beans, no longer exists.
    • Health log category. The watchdog now emits on atoti.server.monitoring.health and atoti.server.monitoring.health.blocked-thread; the legacy com.activeviam.apm.health and com.activeviam.apm.health.blocked-thread names keep working as back-compatibility aliases.
    • Native memory allocator JMX. The DirectChunkAllocator MBean and the activeviam.apm.enable.all.apmanager.statistics property that enabled all its statistics at startup have been removed. The native memory allocator is already exposed by the Atoti starter as the MemoryAllocator MBean; enable its recursive statistics on demand through that MBean if needed.
  • The atoti-server-apm-starter Spring Boot starter has been removed. Its auto-configuration is now part of the main atoti-server-starter: node-instance-name logging is always set up (the activeviam.apm.node.starter.logging.enabled toggle no longer exists), and the blocked-thread watchdog is opt-in via atoti.server.monitoring.blockedThreadWatchdog.enabled.
  • A distributed application can no longer declare several distributing levels that belong to the same hierarchy. Previously the manager description accepted such a configuration with no error, and every entry was kept as an independent distributing level even though the levels of one hierarchy are nested, so the extra level brought no additional partitioning. The configuration is now rejected when the description is validated, raising a DescriptionException. Keep at most one distributing level per hierarchy.
  • A virtual (non-measure) hierarchy whose level resolves to an OBJECT content type without a member name parser now throws a ConfigurationException when the cube is built. Previously this misconfiguration only logged a SEVERE message and let the cube build in a degraded state. To migrate, either define a member name parser on the level (for example via the level builder’s withMemberNameParserPluginKey method, or in the IAxisLevelDescription implementation describing the level) or avoid the OBJECT discriminator.

Removed features

No longer supported

  • IParquetParsingInfo#getSkippedRecordCount() has been removed. It always returned 0.
  • SnowflakeDialectSettings#SnowflakeDialectSettingsBuilder#arrayAggWrapperFunctionName(String) has been removed. The built-in SQL function from Snowflake is now faster.
  • DatabricksDialectSettings#DatabricksDialectSettingsBuilder#xxxNativeArrayUdafName(String) have been removed. Databricks has deprecated the use of Spark UDAFs. Review your database schema to use emulated vectors (multi-row or multi-column) instead.
  • The concealed measures feature has been removed from the distributed data cluster definition. The withConcealedMeasures(...) builder methods, IDataClusterDefinition#getConcealedMeasures/setConcealedMeasures, and the now-redundant withAllMeasures() builder step no longer exist. Remove any call to withAllMeasures() from data cluster definitions; the builder now goes straight from the hierarchy concealment step to branch concealment. Concealing hierarchies and branches remains available.
  • The deprecated method IDatabaseSchema#getDatabaseId() has been removed. It was only used internally and has no public replacement.
  • The deprecated IEpochManager#IDENTIFIER constant has been removed. It was only used internally and has no public replacement.
  • The deprecated IAxisHierarchyVersion has been removed from the public API. Use IAxisHierarchy instead.
  • SubCubeProperties#getSubCubeTree(String dimension, String hierarchy) has been removed. It was only used internally and has no public replacement.
  • The deprecated IRecordFormat#dictionarize and IRecordFormat#undictionarize static methods have been removed from the public API. They were intended only for internal use and have no public replacement.

With alternatives

  • IParquetParsingInfo#getPublishedRecordCount() has been removed. Use getRecordCount() instead.
  • IApplicationDescriptionBuilderWithId#withoutDistributingFields() has been renamed to withoutDistributingLevels().
  • QueryClusterDefinition.DistributedApplicationDefinitionV2 has been renamed to QueryClusterDefinition.DistributedApplicationDefinition.
  • IJdbcSource has been removed. Replace all usages with the concrete JdbcSource class.
  • Deprecated method IQueryExecution#shouldBypassNonJitProviders has been removed. Use IQueryExecution#skipNonJitProviders instead.
  • The BITMAP_PLUGIN_TYPE, JIT_PLUGIN_TYPE and LEAF_PLUGIN_TYPE constants on IBuildableAggregateProviderDescriptionBuilder have been removed. Use the equivalents on IAggregateProviderDefinition.
  • Deprecated method IMultiVersionDistributedActivePivot#unloadMembersFromDataNode has been removed, along with the IMessengerDefinition#UNLOAD_MEMBERS_MESSAGE_TIMEOUT property and the distribution.unload_members_from_data_node.* metrics. Use IMultiVersionDataActivePivot#maskMembers instead.
  • Deprecated method IMultiVersionDistributedActivePivot#getDistributedApplicationInformation() has been removed. Use getApplicationNames() instead, which returns only the distributed application names and not the per-application distributing levels.
  • The Maven modules com.activeviam.activepivot:activepivot-impl and com.activeviam.activepivot:activepivot-intf have been merged into com.activeviam.activepivot:activepivot-core, use it directly.
  • The Maven modules com.activeviam.activepivot:activepivot-server-impl and com.activeviam.activepivot:activepivot-server-intf have been merged into com.activeviam.activepivot:server, use it directly.
  • The empty Maven module com.activeviam.activepivot:activepivot-copper has been removed. Import com.activeviam.activepivot:activepivot-core and optionally com.activeviam.activepivot:activepivot-dist-impl instead.
  • The empty Maven module com.activeviam.activepivot:activepivot-ext has been removed. Import com.activeviam.activepivot:activepivot-core and optionally com.activeviam.activepivot:activepivot-dist-impl instead.
  • The empty Maven module com.activeviam.springboot:atoti-runtime-starter, kept as an alias since it was renamed in 6.1, has been removed. Use com.activeviam.springboot:atoti-server-application-starter instead.
  • Memory sampling (activated via the property “activeviam.mmap.tracking”, and triggered via JMX operations) has been removed. You should now rely on a JFR instead of JMX operations, as those include dedicated JFR events for memory operations. The associated properties “activeviam.mmap.sampling.depth”, “activeviam.mmap.sampling.start” and “activeviam.mmap.sampling.percent” have been removed.
  • MDXQuery is now immutable and the constructors should be used.
  • MDXDrillthroughHeadersQuery is now immutable and the constructors should be used.
  • The deprecated IFieldDescription accessors have been removed:
    • IFieldDescription#isNullable()IFieldDescription#getType().isNullable()
    • IFieldDescription#supportEmptyString()IFieldDescription#getType().supportEmptyString()
    • IFieldDescription#getDefault()IFieldDescription#getType().getDefaultValue()
    • IFieldDescription#getContentClass()IFieldDescription#getType().getDataClass()
  • The activeviam.jwt.* application properties, deprecated since 6.1, have been removed. Use the atoti.jwt.* equivalents instead.
The expiration property is now a Spring Duration. The available formats are described in Spring’s documentation. For this property, a unitless integer will represent seconds. In 6.1, a unitless integer would represent:
  • milliseconds for atoti.jwt.expiration
  • seconds for activeviam.jwt.expiration
If you’re migrating to 6.2 and just changed from activeviam.jwt.expiration: int to atoti.jwt.expiration: int, you need to modify that value accordingly. Adding the unit suffix, such as atoti.jwt.expiration: 12000s is the safest way to configure this property.
  • The deprecated ActiveViam Property activeviam.contentService.nameGenerator.defaultSize has been removed, use activeviam.contentService.nameGenerator.size instead. See the Properties page for its definition.
  • Deprecated method StartBuilding.Builder#withEpochManager(IEpochManager) has been removed. Use StartBuilding.Builder#withEpochPolicy(IEpochManagementPolicy) instead, passing the epoch policy directly rather than wrapping it in an EpochManager.
  • Deprecated method PersistedBuilder#lockOptions(boolean) has been removed. Use PersistedBuilder#databaseLocks(LockOptions) instead. lockOptions(true) becomes databaseLocks(LockOptions.defaultOptions()) and lockOptions(false) needs no call.
  • The deprecated duplicate types under io.atoti.runtime.api.measures and io.atoti.server.common.api.plugins have been removed. Use the identically named types under com.activeviam.atoti.application.api.measures and com.activeviam.atoti.server.common.api.plugins. The automated recipe rewrites these package references.
  • The deprecated 4-argument constructor of ActivePivotTransactionCommittedEvent has been removed. Use the 6-argument constructor, passing -1, -1 for the start and commit timings when they are unknown.
  • The deprecated IGenericAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEY constant has been removed. Use IMultiSourceAggregationFunction.SUM_PRODUCT_FUNCTION_PLUGIN_KEY instead, which is the canonical home for the multi-source sum-product key. The automated recipe rewrites these references.
  • The deprecated integer and integer[] parser type keys (including sized and delimited variants such as integer[10] and integer[][:]) are no longer recognized. Replace them with the canonical int and int[] (and their sized and delimited variants).
  • The public method ICanBuildCommonCubeDescription#withQueryExecutor() has been removed. The cube’s query executor can no longer be replaced through the builder. To observe the query lifecycle, subscribe to the ActivePivotQueryStarted and ActivePivotQueryDone health events. Both events carry the query task identifier, a top-level flag, and the user name and roles. To cancel an in-flight query, pass the task identifier to the Query REST API V10 killQueryById endpoint.
  • Three deprecated members of AAdvancedPostProcessor have been removed:
    • The OUTPUT_TYPE constant → use IPostProcessor.OUTPUT_TYPE_PROPERTY instead.
    • The protected getLevel(String) method → call HierarchiesUtil.getLevel(getActivePivot(), levelDescription) instead.
    • The protected getHierarchy(String) method → call HierarchiesUtil.getHierarchy(getActivePivot(), hierarchyDescription) instead. These methods were only thin delegations to HierarchiesUtil. The automated recipe rewrites both the constant reference and the calls inside your AAdvancedPostProcessor subclasses.
  • The deprecated IDatastoreSchemaDescription accessors have been removed:
    • IDatastoreSchemaDescription#getStoreDescriptions()IDatastoreSchemaDescription#getTables()
    • IDatastoreSchemaDescription#getReferenceDescriptions()IDatastoreSchemaDescription#getJoins()
  • The deprecated IReferenceDescription accessors have been removed:
    • IReferenceDescription#getOwnerStore()IReferenceDescription#getSourceTableName()
    • IReferenceDescription#getTargetStore()IReferenceDescription#getTargetTableName()
  • The deprecated IStoreDescription#getKeyFields() accessor has been removed. Use IStoreDescription#getKeyFieldNames() instead.
  • The deprecated SimpleStoreDescriptionBuilder#keyFields(List<String>) and #keyFields(String...) builder methods have been removed. Use #keyFieldNames(Collection<String>) and #keyFieldNames(String...) instead.
  • The deprecated constructors of ReferenceDescription taking field mappings as a List<? extends IPair<String, String>> have been removed. Use the constructor taking a Set<ITableJoin.FieldMapping> instead.
  • The deprecated StoreDescription(String, Collection<String>, List<? extends IFieldDescription>) constructor has been removed. Use StoreDescription.builder() or StoreDescription.simpleBuilder() instead.
  • The deprecated QueryExecution(Boolean) constructor has been removed. Use QueryExecution.builder() instead.
  • IQueryBasedCubeRestriction and ISecurityCubeRestriction have been removed. Use the concrete QueryBasedCubeRestriction and SecurityCubeRestriction classes instead. In addition, the deprecated IQueryBasedCubeRestriction#getRestrictionFromContext(IContextValueStore) method has been removed along with the interface. Use QueryBasedCubeRestriction.getFromContext(IContextValueStore).getRestriction() instead. The automated recipe rewrites these references.
  • The deprecated IHistory#getContent() method has been removed. Use read() or the matching readXxx() accessor (e.g. readDouble(), readLong()) instead. The automated recipe rewrites getContent() calls to read().
  • EmptyVector has been tightened:
    • EMPTY_VECTORS is no longer public — use EmptyVector.emptyVector(int) to obtain the singleton empty vector for a component type.
    • the componentType field is no longer public — use getComponentType() instead.
    • it no longer implements Cloneable and its clone() method has been removed — empty vectors are singletons, so use the instance directly instead of cloning it.
    • it is now final and can no longer be subclassed.
  • The deprecated Types constants have been removed:
    • Types.TYPE_OBJECT_NOT_NULLABLETypes.TYPE_OBJECT_NON_NULLABLE
    • Types.TYPE_DICTypes.TYPE_OBJECT_DIC
    • Types.TYPE_DIC_NULLABLETypes.TYPE_OBJECT_DIC_NULLABLE
  • The deprecated version() element of the @AtotiRestController annotation has been removed. Use versions(), which accepts several versions at once: replace @AtotiRestController(version = "x") with @AtotiRestController(versions = "x").
  • The legacy hash name of the modulo partitioning function is no longer recognized in partitioning expressions. Replace hash<N>(field) with modulo<N>(field) (for example hash2(id) becomes modulo2(id)) wherever a partitioning string is provided. This affects every API that parses a partitioning-description string, in particular:
    • withPartitioning(String) on the store builder (IStoreDescriptionBuilder) and on the aggregate-provider builder (IBuildableAggregateProviderDescriptionBuilder);
    • the NUMA node selector IStoreDescriptionBuilder…withSelector(String);
    • DatastoreSchemaDescriptionUtil.setPartitioning(...).
  • ISubCubeProperties#getGrantedMembers(String dimension, String hierarchy) is deprecated (not removed); the recipe rewrites calls to getGrantedMembers(HierarchyIdentifier).
  • ActivePivotContentServiceBuilder.ICanInit#needInitialization(String calculatedMemberRole, String kpiRole) has been removed. Use the 3-argument needInitialization(String calculatedMemberRole, String kpiRole, String namedSetRole). The recipe inserts IContentService.ROLE_ROOT as the third (named-set) argument, preserving the previous behavior; pass a more restrictive role if you want to narrow who can create named sets.
  • The deprecated ZeroVector has been removed from the public API. Use SameValueVectorUtils to create such a vector instead, e.g. SameValueVectorUtils#doubleVector(10, 0.0).

API syntax changes

  • CsvParserConfiguration constructors are replaced by a new builder:
    • new CsvParserConfiguration()CsvParserConfiguration.builder().withColumnCount(0).build()
    • new CsvParserConfiguration(int)CsvParserConfiguration.builder().withColumnCount(n).build()
    • new CsvParserConfiguration(List<String>)CsvParserConfiguration.builder().withColumnNames(names).build()
    • new CsvParserConfiguration(Map<Integer, String>)CsvParserConfiguration.builder().withColumnNamesMapping(map).build()
    • Full constructors (7-param and 8-param) are migrated using the builder.
    • Setter calls (e.g. config.setSeparator(';')) are replaced by the corresponding builder methods (e.g. .separator(';')).
    • createCharset method has been removed
  • The ActivePivotQueryStarted and ActivePivotQueryDone constructors take new required parameters for the query task identifier and the top-level flag. Atoti builds these events internally, so update any code that instantiates them directly.

Mutable configuration passed as method argument

The OpenRewrite recipe cannot correctly migrate setter calls on a configuration object received as a method parameter. For example:
The recipe will produce:
Because these configuration classes are now immutable, the reassignment to the local variable has no effect on the caller. Review such methods manually and refactor them to return the updated configuration instead:
  • CsvSourceFactory.create() static methods are replaced by ICsvSource.builder():
    • CsvSourceFactory.create()ICsvSource.builder().build()
    • CsvSourceFactory.create(name)ICsvSource.builder().name(name).build()
    • CsvSourceFactory.create(closeCallback)ICsvSource.builder().closeCallback(closeCallback).build()
    • CsvSourceFactory.create(name, closeCallback)ICsvSource.builder().name(name).closeCallback(closeCallback).build()
  • The ICsvParserConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • The IFileParserConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • The concrete FileParserConfiguration class has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvParserConfiguration class.
  • CsvSourceConfiguration and CsvSourceConfigurationBuilder constructors are replaced by the builder:
    • new CsvSourceConfiguration(int, int, boolean, IComparator)CsvSourceConfiguration.builder().parserThreads(t).bufferSize(b).synchronousMode(s).fileComparator(c).build()
    • new CsvSourceConfigurationBuilder()CsvSourceConfiguration.builder()
    • CsvSourceConfigurationBuilder.DEFAULT_PARSER_THREADS is deprecated; use CsvSourceConfiguration.getDefaultParserThreads() instead.
  • The ICsvSourceConfiguration interface has been removed; replace all usages (return types, variable declarations, and parameter types) with the concrete CsvSourceConfiguration class.
  • SnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(SFSession, String) is replaced by SnowflakeProperties#SnowflakePropertiesBuilder#additionalOption(String, String). Inline the former call using SFSession#getPropertyKey().
  • IParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, Configuration) is replaced by IParquetReaderFactory#create(InputFile, ReadSupport<IParquetRecord>, ParquetConfiguration). Wrap the former Configuration argument using new HadoopParquetConfiguration(configuration).
  • The three IParquetParser#parse overloads that take a Hadoop org.apache.hadoop.fs.Path have been removed:
    • parse(org.apache.hadoop.fs.Path, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(org.apache.hadoop.fs.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(org.apache.hadoop.fs.Path, Configuration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)parse(java.nio.file.Path, ParquetConfiguration, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...). Wrap the former Hadoop Configuration argument with new HadoopParquetConfiguration(configuration).
  • The factory parameter type in four IParquetParser#parse overloads changed from Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel> to ICloudEntityChannelFactory<EntityT>. The affected overloads are:
    • parse(ICloudDirectory<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudDirectory<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudEntityPath<EntityT>, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
    • parse(ICloudEntityPath<EntityT>, ParquetConfiguration, Function<ICloudEntityPath<EntityT>, ? extends SeekableByteChannel>, IParquetFieldParsers, IStoreToParquetMapping, IStoreToParquetMapping...)
  • ICloudEntityPath#getLastModifiedTime() now returns a java.time.Instant instead of a java.util.Date. The value is still the object’s last-modification instant (UTC). Convert with instant.toEpochMilli() where you previously called date.getTime(), or with Date.from(instant) if you need a Date.
  • IAgent no longer extends IExtendedPluginValue. Implementations of IAgent should now also explicitly implement IExtendedPluginValue if needed.
  • The three Logback conversion-rule converters have been moved out of the apm module into dedicated logging artifacts. Update the fully-qualified class names referenced in your logback.xml/logback-spring.xml <conversionRule> declarations:
    • com.activeviam.apm.api.logging.LogInstanceConvertercom.activeviam.tech.logging.logback.api.LogInstanceConverter (artifact com.activeviam.tech:logging-logback-utils)
    • com.activeviam.apm.api.logging.LogThreadConvertercom.activeviam.tech.logging.logback.api.LogThreadConverter (artifact com.activeviam.tech:logging-logback-utils)
    • com.activeviam.apm.api.logging.LogUserConvertercom.activeviam.tech.logging.logback.spring.api.LogUserConverter (artifact com.activeviam.tech:logging-logback-spring)
  • The IMultiVersionDataActivePivot interface has been moved from package com.activeviam.activepivot.dist.impl.api.cube to com.activeviam.activepivot.dist.datanode.impl.api.cube.
  • NoTransactionException has been moved in the public API, from package com.activeviam.database.datastore.internal to com.activeviam.database.datastore.api.transaction.
  • The IMapQuery, IMapDrillthroughQuery and IMapGetAggregatesQuery interfaces have been removed from public API; replace all usages (return types, variable declarations, and parameter types) with the concrete MapDrillthroughQuery or MapGetAggregatesQuery classes.
    • getPivotId() method and all the setters of the concrete classes have been removed
    • IMapDrillthroughQuery.builder() has been moved to MapDrillthroughQuery.builder().
    • MapDrillthroughQueryBuilder#pivotId(String) has been removed
    • MapDrillthroughQuery#getIsFormatted() has been renamed MapDrillthroughQuery#isFormatted()
  • The IDrillthroughHeadersQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete DrillthroughHeadersQuery class. In addition, the methods getFirstResult(), setFirstResult(int), getMaxResults(), setMaxResults(int) have been removed; they had no effect on the results.
  • The IMDXQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXQuery class.
  • The IMDXDrillthroughHeadersQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXDrillthroughHeadersQuery class. In addition, the methods getFirstResult(), setFirstResult(int), getMaxResults(), setMaxResults(int) have been removed; they had no effect on the results.
  • The IMDXDrillthroughQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete MDXDrillthroughQuery class. The method getContent() has been renamed getMdx(); the setters have been removed as the class is now immutable.
  • The IGetAggregatesQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete GetAggregatesQuery class. In addition, getPivotId(), the builder’s pivotId() method, and all the setters have been removed.
  • The IDrillthroughQuery interface has been moved to an internal package; replace all usages (return types, variable declarations, and parameter types) with the concrete DrillthroughQuery class.
  • GetAggregatesQuery constructors are replaced by GetAggregatesQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call .build().
  • DrillthroughQuery constructors are replaced by DrillthroughQuery.builder(). Use the builder methods corresponding to the fields you were passing to the constructor, then call .build().
  • MDXQuery, MDXDrillthroughQuery and MDXDrillthroughHeadersQuery have been moved to package com.activeviam.activepivot.core.api.query, and renamed to MdxQuery, MdxDrillthroughQuery and MdxDrillthroughHeadersQuery.

Post-upgrade

As part of the migration, the names of some loggers and JVM properties may have changed. Warnings will be logged at runtime when using the legacy names in order to allow to identify the ones to migrate. Monitor the logs for these warnings.