defmodule Plausible.Session.WriteBuffer do @moduledoc false %{ header: header, insert_sql: insert_sql, insert_opts: insert_opts, fields: fields, encoding_types: encoding_types } = Plausible.Ingestion.WriteBuffer.compile_time_prepare(Plausible.ClickhouseSessionV2) def child_spec(opts) do opts = Keyword.merge(opts, name: __MODULE__, header: unquote(header), insert_sql: unquote(insert_sql), insert_opts: unquote(insert_opts) ) Plausible.Ingestion.WriteBuffer.child_spec(opts) end def insert(sessions) do row_binary = sessions |> Enum.map(fn %{is_bounce: is_bounce} = session -> {:ok, is_bounce} = Plausible.ClickhouseSessionV2.BoolUInt8.dump(is_bounce) session = %{session | is_bounce: is_bounce} Enum.map(unquote(fields), fn field -> Map.fetch!(session, field) end) end) |> Ch.RowBinary._encode_rows(unquote(encoding_types)) |> IO.iodata_to_binary() :ok = Plausible.Ingestion.WriteBuffer.insert(__MODULE__, row_binary) {:ok, sessions} end def flush do Plausible.Ingestion.WriteBuffer.flush(__MODULE__) end end