analytics/lib/plausible/clickhouse_session_v2.ex

84 lines
2.4 KiB
Elixir

defmodule Plausible.ClickhouseSessionV2 do
@moduledoc """
Session schema for when NumericIDs migration is complete
"""
use Ecto.Schema
defmodule BoolUInt8 do
@moduledoc """
Custom type to cast Bool as UInt8
"""
use Ecto.Type
u8 = Ecto.ParameterizedType.init(Ch, type: "UInt8")
@impl true
def type, do: unquote(Macro.escape(u8))
@impl true
def cast(true), do: {:ok, 1}
def cast(false), do: {:ok, 0}
def cast(nil), do: {:ok, 0}
@impl true
def load(1), do: {:ok, true}
def load(0), do: {:ok, false}
@impl true
def dump(true), do: {:ok, 1}
def dump(false), do: {:ok, 0}
def dump(nil), do: {:ok, 0}
end
@primary_key false
schema "sessions_v2" do
field :hostname, :string
field :site_id, Ch, type: "UInt64"
field :user_id, Ch, type: "UInt64"
field :session_id, Ch, type: "UInt64"
field :start, :naive_datetime
field :duration, Ch, type: "UInt32"
field :is_bounce, BoolUInt8
field :entry_page, :string
field :exit_page, :string
field :exit_page_hostname, :string
field :pageviews, Ch, type: "Int32"
field :events, Ch, type: "Int32"
field :sign, Ch, type: "Int8"
field :"entry_meta.key", {:array, :string}
field :"entry_meta.value", {:array, :string}
field :utm_medium, :string
field :utm_source, :string
field :utm_campaign, :string
field :utm_content, :string
field :utm_term, :string
field :referrer, :string
field :referrer_source, :string
field :click_id_param, Ch, type: "LowCardinality(String)"
field :country_code, Ch, type: "LowCardinality(FixedString(2))"
field :subdivision1_code, Ch, type: "LowCardinality(String)"
field :subdivision2_code, Ch, type: "LowCardinality(String)"
field :city_geoname_id, Ch, type: "UInt32"
field :screen_size, Ch, type: "LowCardinality(String)"
field :operating_system, Ch, type: "LowCardinality(String)"
field :operating_system_version, Ch, type: "LowCardinality(String)"
field :browser, Ch, type: "LowCardinality(String)"
field :browser_version, Ch, type: "LowCardinality(String)"
field :timestamp, :naive_datetime
field :transferred_from, :string
field :acquisition_channel, Ch, type: "LowCardinality(String)", writable: :never
end
def random_uint64() do
:crypto.strong_rand_bytes(8) |> :binary.decode_unsigned()
end
end