84 lines
2.4 KiB
Elixir
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
|