Helpers for using SQL views with Ecto
1# SPDX-FileCopyrightText: 2026 Łukasz Niemier <~@hauleth.dev>
2#
3# SPDX-License-Identifier: Apache-2.0
4
5defmodule EctoView do
6 @moduledoc """
7 Helper functions for refreshing materialised views
8 """
9
10 defmacro __using__([]) do
11 quote do
12 @behaviour unquote(__MODULE__)
13
14 @impl unquote(__MODULE__)
15 def refresh_materialized_view(queryable, opts \\ []) do
16 unquote(__MODULE__).refresh_materialized_view(__MODULE__, queryable)
17 end
18 end
19 end
20
21 @doc """
22 Refresh materialised view
23 """
24 @callback refresh_materialized_view(table :: Ecto.Queryable.t()) ::
25 :ok | {:error, term()}
26
27 ## Implementation functions
28 @doc """
29 Refresh materialised view for given `queryable`.
30 """
31 def refresh_materialized_view(repo, queryable, opts \\ []) do
32 # This way we ensure that `schema` is properly escaped
33 schema = schema_for_query(Ecto.Queryable.to_query(queryable))
34
35 repo.query("REFRESH MATERIALIZED VIEW \"#{schema}\"", opts)
36 end
37
38 defp schema_for_query(%Ecto.Query{from: %Ecto.Query.FromExpr{source: {schema, _}}}) do
39 schema
40 end
41end