Updates since Beta

This page lists the changes since 3.3.0-BETA, and explains any changes required to migrate from 3.3.0-BETA to the stated version of Atoti Limits.

warning

Please note that Atoti Server versions 5.9 and 5.10 are now out-of-support. Therefore, we no longer support connections to servers of these versions starting with this release of Atoti Limits.

Changes since 3.3.0-beta

Added

Issue Key Details
LIM-1002 Added Liquibase changesets to facilitate database migrations.
LIM-1094 Added the maxScopeMembersQueryResult setting to retrieve more members before having to resort to a search.
LIM-1149 Added a preValidation method to the IValidator interface.
LIM-1173 ID’s are now required fields in the limit_structures.csv and limit_approve.csv files.
LIM-1196 Limit files can now be previewed in a table before uploading. Any error when uploading will be shown in the table.
LIM-1209 Upgraded Atoti Server to 6.0.14-sb3.
LIM-1210 Real-time updates can now be disabled/enabled in the UI.
LIM-1215 Column index is now reported for validation errors.
LIM-1236 Added a new limits-migrations module for migrating CSV files. See CSV migrations to 3.3.0.
LIM-1239 Atoti Limits now sends the business server’s asOfDate dimension in the limits /settings endpoint.

Changed

Issue Key Details
BAS-1879 Renamed KpiAlertTask and LimitAlertTask to LimitStructureEvaluationTask and LimitEvaluationTask respectively.
LIM-1142 Moved the default cube configuration classes into the limits-activeviam module. Added beans to allow clients to override the cube configuration. See Custom Cube Configuration
LIM-1146 Replaced IAlertTaskManager with new interfaces to separate evaluation and scheduling logic. See Adding Custom Evaluation Logic for more information.
LIM-1150 Refactored the exceptions thrown in DefaultLimitTuplePublisher to be handled by the IValidationErrorHandler.
LIM-1171 Upgraded the common-dependencies-bom and common-parent-pom versions to 2.0.1. This bumps Spring Boot to version 3.2.4, inheriting bug fixes and improvements.
LIM-1186 Improved performance and UX when creating limits. Nodes from the scope tree will now be lazy-loaded when a scope is being selected.
LIM-1195 Updated default validation behavior to be non-blocking for limits loaded through the DLC. Loading through REST (i.e. file upload) is still an atomic operation.
LIM-1197 Moved REST constants to a dedicated LimitsRestServiceConstants class.
LIM-1198 Moved datastore constants to a dedicated LimitsDatastoreConstants class.
LIM-1208 Expanded support for reporting line numbers in the default validators.
LIM-1218 Improved UX for the Create Limit Structure button on the Limit Structure screen.
LIM-1240 The availableApplicationServers setting has changed from a record to an array of server keys. AsOfDate settings that used to sit under this property are now supplied by the server.

Removed

Issue Key Details
LIM-499 Removed all *.properties files from the Atoti Limits. Removed CsvDataExtractionEngineConfig from the default configuration.

Fixed

Issue Key Details
LIM-570 Fixed a performance issue on startup when reloading workflows.
LIM-1138 Fixed a data quality issue by preventing multiple limit structures with the same name to be created.
LIM-1223 Made the order of incidents in the status screen consistent between realtime-enabled and disabled modes.
LIM-1226 Real time incidents can now be filtered by multiple dates.
LIM-1244 Fixed issue where incidents could be reviewed multiple times.
LIM-1248 On evaluation, incident CSV files will now only be written in the CSV data load mode.
LIM-1253 Fixed an issue that prevented Atoti Limits from starting in persistent mode due to null workflow statuses.
LIM-1256 The Inventory now generates limit structure creation templates according to server keys derived by checking the names coming from the server settings endpoint against server keys supplied to LimitsModuleSettings.availableApplicationServerKeys.

For Removal

Issue Key Details
LIM-1230 Manual configuration has been deprecated in favor of auto-configuration and will be removed in the next version of Atoti Limits.

Fixed issues introduced in 3.3.0-BETA

Issue Key Details
LIM-1190 Fixed bug where copying and saving a limit structure cleared the limit structure form.

Migrate to 3.3.0 from Beta

Upgrading from version 3.3.0-beta, see Atoti Limits 3.3 Release Notes.

Atoti Limits uses Atoti Server 6.0.14-sb3 and Atoti UI 5.1.x. For new features and fixes included in these releases, please see the Atoti UI documentation and Atoti UI Migration Notes, and the release notes for Atoti Server.

Summary

  • Validation API Improvements : Additional methods have been added to IValidator to make it easier to interact with the validators. For more details, see IValidator changes.
  • Modified Default Validation Behavior : The default validation behavior has been updated to be non-blocking for limits loaded through the DLC. Loading through REST (i.e. file upload) is still an atomic operation.
  • Custom Evaluations : The IEvaluationService and IEvaluationTaskManager interfaces have been introduced to facilitate custom evaluation logic. See Adding Custom Evaluation Logic for more information.
  • Migration scripts : We have added a new limits-migrations module for migrating CSV files. See CSV and properties migrations to 3.3.0.

Breaking Changes

Managed Object ID behavior

The behavior has changed for how IDs are used in Atoti Limits. Previously, for each structure, limit, or incident, a *key field was generated using a hash of that object’s key fields. Now we expect the following:

  • when the user creates a structure/limit/incident using the DLC or the UI file upload, we expect the ID to be populated in the file.
  • when the user creates a structure/limit/incident, we don’t expect the ID to be populated and instead we will auto-generate it on the server using implementations of IIdentityGenerator.

This behavior was introduced to simplify the user experience, to enhance data integrity, and to prevent potential hash-collisions.

Starter customizations

If you previously modified the data loading or cube configuration code in the limits-starter module then you will have to migrate that code. Please see the dev extensions section for how to do so.

Split of IAlertTaskManager

The IAlertTaskManager interface has been replaced with two interfaces to separate evaluation logic from scheduling logic. If you have a custom implementation of IAlertTaskManager, you will need to replace it with implementations of one or both of IEvaluationService and IEvaluationTaskManager. For more information on the new interfaces and how to implement them, see Adding Custom Evaluation Logic.

Entity field type changes

The following entity fields have been converted from arrays to singular values:

Entity Field Old Type New Type
LimitEntity limitValue Double Array Double
LimitsWorkflowProcessInstanceEntity limitValues Double Array Double
LimitsWorkflowProcessInstanceEntity scopeArray String Array String

If you persist these in a database then the column type should be updated accordingly.

*ActivePivot* classes renamed to *AtotiServer*

Classes that follow the naming convention *ActivePivot* have been renamed to match *AtotiServer*. If you have any custom code that references these classes, you will need to update them.

UI Settings change

The availableApplicationServers setting has changed from a record to an array of server keys. AsOfDate settings that used to sit under this property are now supplied by the server, and therefore no longer need to be provided in the UI settings.

CSV and properties migrations to 3.3.0

The migration script migrates the limit_structures.csv files and limits.csv files from Atoti Limits 3.2.0 to 3.3.0. For details on how it works, see the 3.3.0 Migration Notes.

Input file formats

No changes.

Configuration files

The following *.properties property files have been deleted. Properties still in use have been moved to @ConfigurationProperties classes or application.yml:

  • env-default.properties
  • jwt.properties
  • limits.properties
  • limits_test.properties
  • tracing.properties

Files Modified

application.yml

New properties:

Property Name Comment Value
spring.liquibase.enabled True if Liquibase database schema migrations listed in limits-starter/src/main/resources/liquibase/master-changelog.yaml should be applied on startup. false
spring.liquibase.change-log The location of the changelog file if Liquibase database schema migrations are applied on startup. classpath:/liquibase/master-changelog.yaml

Datastores

Modified stores

Modification Store Field Type Description
Renamed Limit Structures Reference ID string Reference ID has been renamed to Structure ID.
Deleted Limit Structures structureKey string structureKey has been deleted. Structure ID will be used instead.
Renamed Limits Reference ID string Reference ID has been renamed to Structure ID.
Renamed Limits parentLimitKey string parentLimitKey has been renamed to Source Limit ID.
Deleted Limits limitKey string limitKey has been deleted. Limit ID will be used instead.
Deleted Limits structureKey string structureKey has been deleted. Structure ID will be used instead.
Deleted Limits Limit Name string The unused Limit Name column has been deleted.
Renamed Incidents incidentKey string incidentKey has been renamed to Incident ID.
Renamed Incidents limitKey string limitKey has been renamed to Limit ID.

Cube schema

The limitKey hierarchy has been renamed to limitId.

Measures

No changes.

Context values

No changes.

Other changes

IValidator changes

The following methods have been added to the IValidator interface. If you previously implemented a custom IValidator class, you will need to update it to include these methods. If you have not implemented a custom IValidator class, you do not need to make any changes.

/** Operations to be performed before validation is started. */
void preValidation(Collection<T> objectsToValidate);

/**
 * @return true if validation succeeds for the tuple, false otherwise
 */
boolean validateTuple(Object[] tuple, int lineNumber);

/**
 * @return objects that have passed validation
 */
List<T> getValidObjects();

/**
 * @return objects that have failed validation
 */
List<T> getInvalidObjects();

/**
 * Clears the state of the validator, so it is ready to validate a new set of objects.
 *
 * @param throwException if true, an exception will be thrown if there are validation errors
 */
void reset(boolean throwException);

/**
 * @return true if there are validation errors, false otherwise
 */
boolean hasErrors();

The intent behind these changes is to have the validators keep better track of their state. This allows for better separation between validation logic and handling of valid/invalid objects. getValidObjects, getInvalidObjects and hasErrors allow calling code to access the state of the validator, and reset is used to clear the state of the validator between validation operations.

Additionally, to pair with the existing postValidation method, we have added a preValidation method to the IValidator interface. This method is called before the validate/validateAll methods and can be used to perform any pre-validation checks or operations. The default implementations of IValidator included with Atoti Limits have been updated to include an implementation of preValidation that populates a map of row indexes by ID to help with reporting line numbers for validation errors.

A validateTuple method has also been added to the IValidator interface. This method is called for each tuple in a file being validated. This allows for more fine-grained control over the validation process, validating tuples prior to converting them to objects.

Changes to ILimitsProcessInstanceWorkflowService

You will need to modify the update method to the new signature which includes the additional publishTuples and refreshKpis parameters.