Service functions for managing query visualizations in Lotus storage.
- CRUD wrappers around
Lotus.Storage.QueryVisualization - Validation against a
%Lotus.Result{}to ensure field references exist and numeric aggregations apply to numeric columns.
Content changes
create_visualization/3, update_visualization/3 and
delete_visualization/2 take opts with a :context, opaque caller data
such as the current user. Each write fires the :before_content_change and
:after_content_change middleware with resource :visualization. A plug
that halts makes the function return {:error, {:halted, reason}} and
nothing is written. See Lotus.Middleware.
Summary
Functions
Validates a visualization config against a query result.
Types
Functions
@spec create_visualization(Lotus.Storage.Query.t() | id(), attrs(), keyword()) :: {:ok, Lotus.Storage.QueryVisualization.t()} | {:error, Ecto.Changeset.t() | Lotus.Middleware.halted()}
@spec delete_visualization(Lotus.Storage.QueryVisualization.t() | id(), keyword()) :: {:ok, Lotus.Storage.QueryVisualization.t()} | {:error, Ecto.Changeset.t() | :not_found | Lotus.Middleware.halted()}
@spec list_visualizations(Lotus.Storage.Query.t() | id()) :: [ Lotus.Storage.QueryVisualization.t() ]
@spec update_visualization(Lotus.Storage.QueryVisualization.t(), attrs(), keyword()) :: {:ok, Lotus.Storage.QueryVisualization.t()} | {:error, Ecto.Changeset.t() | Lotus.Middleware.halted()}
@spec validate_against_result(map(), Lotus.Result.t()) :: :ok | {:error, String.t()}
Validates a visualization config against a query result.
Checks:
- Referenced fields exist in
result.columnsfor x, y, series, and filters - Numeric aggregations (:sum, :avg) only apply to numeric columns
This does not persist anything; it is safe to call before create_/update_.