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.
[0.6.0] - 2026-08-21
Added
- Built-in data-layer capability sets for
AshClickhouse.DataLayer,AshScylla.DataLayer, andAshSqlite.DataLayer(AshDyan.DataLayer.Clickhouse,AshDyan.DataLayer.Scylla,AshDyan.DataLayer.Sqlite), alongside the existing Postgres and ETS support. AshDyan.Charts.to_svg/3— server-side SVG renderer forAshDyan.Result(AshDyan.Charts.SVG). Produces a standalone<svg>string with no JavaScript or external assets, suitable for emails, PDFs, and non-JS contexts. Supports:bar,:line,:pie, and:doughnutchart types with:width,:height, and:titleoptions; visual conventions match the Chart.js/ECharts adapters.AshDyan.DataLayer.capabilities/1andcapabilities_for_data_layer/2— normalized metadata describing a data layer's supported analyses, query primitives (filter,select,limit,timeout,sort), and aggregation strategy (mode,functions). Custom capability modules may implement the optionalcapabilities/1callback to advertise native features; omitted sections fall back to conservative defaults.AshDyan.DataLayer.for_data_layer/1— resolve the capability module for an explicit data-layer module.
[0.4.0] - 2026-08-08
Added
AshDyan.Extensionbehaviour plusAshDyan.Extension.Loaderfor formal, composable extensions that register analysis types, data-layer capabilities, custom aggregates, pipeline hooks, and DSL entities without forking.- Pipeline hooks via the
AshDyan.Engine.Hookbehaviour:before_query,after_query,before_format,after_formatstages, runnable from eitherconfig :ash_dyan, :hooksor an extension. - New optional
AshDyan.Analysiscallbacks with default no-op implementations:build_query/2,pre_aggregate/2,post_aggregate/2. AshDyan.Engine.format/2— formats records through the analysis module (includingpre_aggregate/post_aggregateand presentation post-processing) and runs pipeline hooks.Result.format/2is now deprecated.AshDyan.Analysis.Registry.fetch!/1— raises on an unknown analysis type.- New optional
AshDyan.DataLayercallbacks:pushdown_aggregate/3,stream/3, andpaginate/3. - Runnable Phoenix + LiveView demo under
examples/ash_dyan_demo/(in-memory data layer, seven live charts) with screenshot inguides/demo_ash_dyan.png.
Changed
Analysis.Registry,DataLayer.for_resource/1, and aggregate validation now consultAshDyan.Extension.Loader.load()so extension-registered entries are honored alongsideconfig :ash_dyan, ...(config wins on key conflicts).AshDyan.Engine.run_query/3now runsafter_queryhooks, returns{:ok, records}, and rescues raised errors into{:error, term}.AshDyan.DataLayer.Simple.supports?/2gained a catch-allfalseclause.
[0.1.0] - 2026-07-10
Added
- Initial release of AshDyan.
dyanDSL extension for declaring analyzable fields on Ash resources.- Domain-level
dyanregistry viaAshDyan.Domain. - Runtime analysis engine (
AshDyan.run/1,2) supporting:- frequency / group-by counts
- numeric aggregates (sum, avg, min, max, count, count_distinct, stddev, variance, median)
- time bucketing
- percentiles
- histograms
- In-memory aggregation bounded by
max_limit,max_group_by, andquery_timeout. - Capability check API (
AshDyan.supports?/2) for data-layer limits. - Structured errors via
AshDyan.Errorwith stablereasonatoms. - Chart adapter (
AshDyan.Charts.to_chartjs/1). - Documentation guides (
guides/usage.md,guides/design.md).
Changed
- Removed the shipped Phoenix/Channel/gen_api adapter modules
(
AshDyan.Adapters.*). AshDyan is now fully standalone — noplugdependency at compile time. Delivery layers are documented as copy-paste snippets (see README "Building an adapter") rather than versioned APIs. :sumnow rejectsnilvalues before reducing (matching every other aggregate), so a column with anilno longer raisesArithmeticError.AshDyan.Engine.apply_filters/2documents that filters are parsed internally viaAsh.Filter.parse/2(notfilter_input) so thedyanwhitelist stays the security boundary.AshDyan.Info.analyzable_field/3typespec now includes:histogram.