> ## Documentation Index
> Fetch the complete documentation index at: https://docs.activeviam.com/llms.txt
> Use this file to discover all available pages before exploring further.

# What's new in 5.10

## 5.10

### New features

* **User Defined Aggregate Functions on Measures**: It is now possible for user-defined aggregate
  functions to work on measures (instead of facts). This can be achieved using the Copper API. The
  documentation is
  available [here](../../../copper/copper_measures#user-defined-aggregate-functions-on-measures).
* **Copper Join hierarchy with multiple levels**: The Copper API now lets you define Join
  hierarchies with several levels.
* **Option to set the visibility of hierarchies and dimensions through context values**: the MDX
  context now has a feature that can override the visibility of a hierarchy or a dimension. This
  feature can be used through `MdxContext::setHierarchyVisibility()` or through the MDX context
  builder via `IMdxContextBuilder::overrideHierarchyVisibility()` (analogous methods exist for
  dimensions).
* **Copper Store Lookups**: The Copper API lets you define store look-ups measures that run a
  get-by-key query on the selected store.

### Improvements

* Chunks gained a new compression method: Frequency compression. When the Datastore detects a value
  repeated many times in a chunk, the chunk is compressed to store only *explicit* values, while
  recording the *implicit* values repeated many times.<br />
  The compression happens when a value appears more than `x` % in the chunk.
  `x` can be specified as a ratio through the
  property `ActiveViamProperty#CHUNK_FREQUENCY_COMPRESSION_RATIO_PROPERTY`. The compression can be
  enabled or disabled for each of the following five data types: `int`, `float`, `long`, `double`
  and `object`. This can be controlled through the
  property: `ActiveViamProperty#ENABLED_FREQUENCY_COMPRESSIONS_PROPERTY`.
* When a data node is being shutdown, it will send a `GoodbyeMessage` to the query node which will
  immediately trigger an asynchronous task responsible for removing all subsequent contributions of
  the former. On success, a `GoodbyeMessageApplicationEvent` is generated. Otherwise, on failure of
  the removal task, a `GoodbyeMessageApplicationFailureEvent` is generated. This lets ActivePivot
  distinguish the clean removal of a data node from one that is momentarily unresponsive.
* When executing a query, intermediary results that have been computed and that are not required by
  any remaining computations are now discarded and are available for garbage collection.

### Miscellaneous

* The Azure Cloud Source has migrated its dependency to the Azure Blob Storage SDK from version 8 to
  version 12. This change came along a number of changes in the module's interface. More about this
  can be read on the [migration notes](migration_notes).
