Kotlin Release Notes
4.11 - DQL & Legacy Compatibility
With 4.11 we are excited to introduce legacy compatibility for DQL, which allows developers to use the new DQL APIs while maintaining compatibility with existing code and data. This capability, called STRICT MODE, is designed to ease the transition to the new APIs and ensure that existing applications continue to function as expected.
DQL Strict Mode
DQL Strict Mode provides control over how DQL statements are evaluated and how data types are inferred. When disabled, it offers more flexibility in working with documents without requiring explicit collection definitions.
DQL Strict Mode
With strict mode disabled (DQL_STRICT_MODE=false
), Ditto is more flexible and will infer the CRDT type based on the document’s shape:
- Objects are treated as CRDT maps
- Scalars and arrays are treated as Registers
- Counters and attachments are inferred from operations
- Collection definitions are no longer required
Setting DQL Strict Mode
DQL Differ
DQL 4.11 introduces a new Differ
API for calculating diffs between query results.
This API can be used with a store observer to understand how its results change
over successive callbacks. The Differ
API provides a way to track changes in
the data and can be used to optimize data synchronization and conflict resolution.
DQL Transactions
DQL 4.11 introduces support for transactions. Transactions can be used to group multiple DQL statements together, ensuring that either all of the statements are executed successfully or none of them are. This is particularly useful in scenarios where multiple updates or inserts need to be made to the database, and you want to ensure that either all of them are applied or none of them are.
Transactions API documentation.
Advanced DQL Features
DQL 4.11 introduces numerous advanced querying and manipulation features:
Feature | Description | Example |
---|---|---|
UNSET clause | Remove fields from documents | UPDATE orders UNSET items.abc WHERE _id = 'my-id' |
CAST function | Explicitly convert between data types | SELECT * FROM products WHERE CAST(price AS INT) > 10 |
USE IDS clause | Direct document retrieval by ID | SELECT * FROM products USE IDS ['123', '456'] |
SIMILAR TO | Pattern matching expressions | SELECT * FROM products WHERE name SIMILAR TO '%phone%' |
Runtime expressions | Use expressions in object/array construction | UPDATE products SET metadata = { 'updated_at': current_timestamp() } |
Counters | Support for legacy compatible counter type | UPDATE products APPLY in_stock PN_INCREMENT BY 1.0 |
In 4.11, functional operations are denoted with an arrow (->
) are deprecated.
Tombstone Reaper
The tombstone reaper is now enabled by default for all SDKs. This feature helps clean up deleted document markers (tombstones) to improve database performance and reduce storage requirements.
The reaper:
- Automatically removes tombstones after a configurable time-to-live (TTL)
- Uses read transactions for efficiency
- Includes random scheduling variations to prevent performance problems
- Tracks the number of tombstones evicted for monitoring
- Remembers previous reap times across restarts
This improves overall system performance by reducing the long-term accumulation of
tombstones when calling DELETE
to remove documents.
4.11.0 Common Changelog
4.11.0 Kotlin & Java Specific Changes
Added: DittoTransaction
representing an active DQL transaction. (#15873)
Added: DittoTransactionInfo
encapsulating information about a transaction. (#15873)
Added: Method transaction()
on DittoStore
allowing a DQL transaction to be performed. (#15873)
- DittoTransactionCompletionAction
representing an action to be taken upon the completion of a transaction: commit or rollback. (#15873)
Added: An opt-in Android foreground service which allows Ditto to sync in the background. (#16097)
Added: The new DittoDocumentPath::number
and DittoDocumentPath::numberValue
accessors. (#16776)
Fixed: transport config changes that are made directly on the DittoTransportConfig
object that a Ditto
instance references are now applied when startSync
is called. (#16835)
Fixed: WiFi Aware occasional failure to start advertising (#16844)
Fixed: Transaction hints in log messages from calls to upsert()
included $name
instead of the actual collection name. (#SDKS-1012)
Added: class DittoDiffer
, which calculates diffs between query results. This can be used with a store observer to understand how its results change over successive callbacks. (SDKS-981)
Added: class DittoDiff
to represent diffs produced by the DittoDiffer
. (SDKS-981)
Changed: Unify dedicated TCP servers across different transports (Multicast, mDNS, and WiFi Aware) by utilizing a single static TCP server implementation (#TRANS-131)