Helpers for using SQL views with Ecto
at master 41 lines 1.1 kB view raw
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