Current section

Files

Jump to
phoenix_analytics lib phoenix_analytics queries insert.ex
Raw

lib/phoenix_analytics/queries/insert.ex

defmodule PhoenixAnalytics.Queries.Insert do
@moduledoc false
alias PhoenixAnalytics.Queries.Table
alias PhoenixAnalytics.Entities.RequestLog
@table Table.name()
@columns ~w(request_id method path status_code duration_ms user_agent remote_ip referer device session_id session_page_views inserted_at)
@placeholders List.duplicate("?", length(@columns)) |> Enum.join(", ")
@query "INSERT INTO #{@table} (#{Enum.join(@columns, ", ")}) VALUES (#{@placeholders});"
@spec insert_one(RequestLog.t()) :: {String.t(), list()}
def insert_one(%RequestLog{} = request_data) do
{@query, prepare_values(request_data)}
end
@spec insert_many(list(RequestLog.t())) :: {String.t(), list()}
def insert_many(request_data_list) when is_list(request_data_list) do
batch_size = length(request_data_list)
values_placeholders = List.duplicate("(#{@placeholders})", batch_size) |> Enum.join(", ")
batch_query =
"INSERT INTO #{@table} (#{Enum.join(@columns, ", ")}) VALUES #{values_placeholders};"
values = Enum.flat_map(request_data_list, &prepare_values/1)
{batch_query, values}
end
@spec prepare_values(RequestLog.t()) :: list()
defp prepare_values(%RequestLog{} = request_data) do
[
request_data.request_id,
request_data.method,
request_data.path,
request_data.status_code,
request_data.duration_ms,
request_data.user_agent,
request_data.remote_ip,
request_data.referer,
request_data.device_type,
request_data.session_id,
request_data.session_page_views,
request_data.inserted_at
]
end
end