All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Added
- Comprehensive test suite (
data_layer_comprehensive_test.exs) covering 65+ test cases for gaps in existing coverage:run_query/2edge cases (empty results, multiple rows, select, distinct, keyset pagination, AND/OR filters, sort+limit, nil content)filter/3OR rewriting edge cases (triple OR, different columns, nested AND/OR, single filter)sort/3edge cases (empty list, multiple items, map format, tuple format)bulk_create/3scenarios (empty list, batch_size, return_records?, error handling, map opts)source/1edge cases (empty string table, @table attribute, caching)repo/1edge cases (@repo attribute, caching, resource without DSL)upsert/4delegation toupsert/3run_aggregate_query/3(multiple aggregates, COUNT(field), empty aggregates, WHERE clause)distinct/3(multiple PK columns, mixed PK/non-PK, empty list)calculate/3(multiple calculations, module without calculate/2)handle_scylla_result/1(all 6 error paths)sanitize_identifier/1(valid/invalid identifiers)maybe_rewrite_or_to_in/1(4-way OR, nested AND, single equality)- DataLayer struct defaults verification
- Exhaustive
can?/2feature testing (supported, unsupported, tuples, nil/string/integer)
Fixed
run_aggregate_query/3: Handle empty page content ([]andnil) gracefully by returning0instead of crashing withMatchErrorfetch_by_primary_key/3: Return structuredScyllaErrorfor empty results instead of crashing withMatchError- Updated README test structure documentation
- Updated error handling guide with record-not-found and aggregate empty result scenarios
0.6.0 - 2026-06-11
Changed
- BREAKING: Migrated from Exandra/Ecto.Repo pattern to direct Xandra connections.
AshScylla.Reponow wrapsAshScylla.Connection(a GenServer aroundXandra.start_link/1) instead of using Ecto.Repo. AshScylla.Connectionreplaces the Exandra/Ecto.Repo pattern for direct Xandra connection management.AshScylla.Migratornow usesAshScylla.Connectioninstead of Ecto SQL migrations.- Resource definitions now use
domain:instead ofrepo:(Ash Framework best practice). - Relaxed Ash dependency from
~> 3.28to~> 3.0for broader compatibility.
Added
AshScylla.Connection— direct Xandra connection wrapper withquery/4,query!/4,prepare/3,prepare!/3,stop/1.AshScylla.Migrator.run_on/2andrun_on!/2— execute CQL on an existing named connection.- Prepared statement caching via
AshScylla.PreparedStatementCache. - Telemetry integration via
AshScylla.Telemetry. - Token-based pagination via
AshScylla.DataLayer.Pagination. - Async partition-aware batch operations via
AshScylla.DataLayer.Batch.batch_insert_async/3.
Fixed
- All documentation and examples updated to reflect Xandra migration (no more Ecto.Repo, Ecto.Migration, or Exandra references in user-facing code).
- Mock repos in tests now return proper
Xandra.Pagestructs instead of plain maps.
0.5.0 - 2026-06-11
Added
@specannotations across all public and private API modules.dialyxirfor CI type checking.- Filter validation to prevent ALLOW FILTERING anti-pattern.
AshScylla.ResourceGenerator—mix ash_scylla.gentask for scaffolding resources.- Dev container support (.devcontainer).
Fixed
- Integration tests can now be run with
mix test test/scylla_integration_test.exs --only integration. - Removed unused
require Loggerfrom several modules. - Updated README feature/limitation tables for ScyllaDB accuracy.
0.4.0 - 2026-06-10
Changed
- BREAKING: Removed
:sortand:offsetfrom@supported_features— these are not natively supported by ScyllaDB and were causing silent failures.can?(:sort)andcan?(:offset)now returnfalse. - Added
data_layer_keyset_by_default?/0returningtrue— keyset pagination is now the default pagination mode. - Added runtime
Logger.warninginsort/3andoffset/3callbacks to alert callers about ScyllaDB limitations. - Relaxed Ash dependency from
~> 3.24to~> 3.0for broader compatibility. - Moved
AshScylla.RepoandAshScylla.Migrationout of the Core ExDoc group into "Repo Helpers" and "Schema Helpers" respectively. - Clarified
AshScylla.Migrationdocs — it generates raw CQL DDL strings, not Ecto SQL migrations. - Updated
IMPLEMENTATION_SUMMARY.mddependency table to remove incorrectreactorandtestcontainersentries, add missing dev deps.
Fixed
- Removed unused
require LoggerfromFilterValidator,Dsl,Telemetryandrequire XandrafromDataLayer. - Updated test assertions to match new
can?/2behavior and current version0.4.0.
0.3.0 - 2026-06-09
Added
- Per-action consistency configuration via
per_action_consistencyDSL option - Token-based pagination support via
AshScylla.DataLayer.Pagination - Prepared statement caching via
AshScylla.PreparedStatementCache(GenServer + ETS) - Telemetry integration via
AshScylla.Telemetrywith query/batch span events AshScylla.Error.ScyllaErrorstructured error types with suggestions- Retry logic with error-type-specific delays
AshScylla.Repohelper module withcreate_keyspace/1,drop_keyspace/1,recommended_pool_size/0AshScylla.Migrationhelpers for CQL generation from Ash resources- Materialized view support with CQL generation
- Async partition-aware batch operations via
batch_insert_async/4 - Testcontainer-based integration tests
0.2.0 - 2025-01-01
Added
- Secondary index support in DSL and migration helpers
- Materialized view DSL configuration
- Batch operations (BATCH INSERT/UPDATE/DELETE)
- Bulk create support via
Ash.bulk_create - TTL (Time To Live) support for INSERT statements
- Consistency level configuration per resource
- Comprehensive error handling with Xandra error categorization
- QueryBuilder with filter-to-CQL conversion
- Edge case test suite
0.1.0 - 2024-06-01
Added
- Initial release
- Ash.DataLayer behaviour implementation for ScyllaDB via Xandra
- CRUD operations (create, read, update, destroy)
- Filter, sort, limit, offset, select support
- Multitenancy via keyspace-based tenant isolation
- Basic CQL query generation from Ash queries