| 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 |
|
|