AshDyan.Analysis behaviour (AshDyan v0.5.0)

Copy Markdown View Source

Behaviour for a single analysis capability (frequency, aggregate, time_bucket, percentile, histogram, ...).

AshDyan's analysis types were previously a closed sum type scattered across parallel case/when clauses in AshDyan.Request, AshDyan.Engine, AshDyan.Engine.Formatter, and AshDyan.Charts. Implementing this behaviour and registering the module under config :ash_dyan, :analysis_types lets a downstream app add a new analysis type (e.g. :funnel, :cohort) without forking AshDyan.

Example

defmodule MyApp.AshDyan.Funnel do
  @behaviour AshDyan.Analysis
  # ... implement the callbacks ...
end

# config/config.exs
config :ash_dyan, :analysis_types, %{funnel: MyApp.AshDyan.Funnel}

The request's :type is the registry key.

Summary

Types

query()

@type query() :: Ash.Query.t()

records()

@type records() :: [Ash.Resource.Record.t()]

request()

@type request() :: AshDyan.Request.t()

result()

@type result() :: AshDyan.Result.t()

Callbacks

build_query(query, request)

@callback build_query(query(), request()) :: query() | {:ok, query()}

format(request, records)

@callback format(request(), records()) :: {:ok, result()} | {:error, term()}

post_aggregate(result, request)

@callback post_aggregate(result(), request()) :: result()

pre_aggregate(records, request)

@callback pre_aggregate(records(), request()) :: records()

recommend_chart(result)

@callback recommend_chart(result()) :: AshDyan.Charts.chart_type()

select_fields(request)

@callback select_fields(request()) :: [atom()]

supports_presentation?(atom)

@callback supports_presentation?(atom()) :: boolean()

validate(request)

@callback validate(request()) :: :ok | {:error, AshDyan.Error.t()}

Functions

build_query(query, request)

post_aggregate(result, request)

pre_aggregate(records, request)

supports_presentation?(option)