%% @doc Indexes for per-admin stats: report.resolved_by, ticket.assigned_to. -module('20260717190000_admin_stats_indexes'). -export([up/0, down/0]). -include("records.hrl"). up() -> ensure_index(report, resolved_by, #report.resolved_by), ensure_index(ticket, assigned_to, #ticket.assigned_to), ok. down() -> del_index(report, resolved_by), del_index(ticket, assigned_to), ok. ensure_index(Table, Attr, Pos) -> case lists:member(Table, mnesia:system_info(tables)) of false -> ok; true -> Indexes = mnesia:table_info(Table, index), HasIndex = lists:any(fun (A) when A =:= Attr -> true; (N) when is_integer(N) -> N =:= Pos; (_) -> false end, Indexes), case HasIndex of true -> ok; false -> case mnesia:add_table_index(Table, Attr) of {atomic, ok} -> ok; {aborted, {already_exists, _}} -> ok; {aborted, {already_exists, _, _}} -> ok; {aborted, Reason} -> error({add_index_failed, Table, Attr, Reason}) end end end. del_index(Table, Attr) -> case lists:member(Table, mnesia:system_info(tables)) of false -> ok; true -> case catch mnesia:del_table_index(Table, Attr) of {atomic, ok} -> ok; {aborted, {no_exists, _}} -> ok; {aborted, {no_exists, _, _}} -> ok; _ -> ok end end.