Powered by AppSignal & Oban Pro

Analyze v2 social metrics usage

analyze_social_v2_metrics_usage.livemd

Analyze v2 social metrics usage

Section

metrics_list = [
  "sentiment_balance_4chan_v2",
  "sentiment_balance_bitcointalk_v2",
  "sentiment_balance_reddit_v2",
  "sentiment_balance_telegram_v2",
  "sentiment_balance_total_v2",
  "sentiment_balance_twitter_v2",
  "sentiment_balance_youtube_videos_v2",
  "sentiment_weighted_4chan_1d_v2",
  "sentiment_weighted_4chan_1h_v2",
  "sentiment_weighted_4chan_v2",
  "sentiment_weighted_bitcointalk_1d_v2",
  "sentiment_weighted_bitcointalk_1h_v2",
  "sentiment_weighted_bitcointalk_v2",
  "sentiment_weighted_reddit_1d_v2",
  "sentiment_weighted_reddit_1h_v2",
  "sentiment_weighted_reddit_v2",
  "sentiment_weighted_telegram_1d_v2",
  "sentiment_weighted_telegram_1h_v2",
  "sentiment_weighted_telegram_v2",
  "sentiment_weighted_total_1d_v2",
  "sentiment_weighted_total_1h_v2",
  "sentiment_weighted_total_v2",
  "sentiment_weighted_twitter_1d_v2",
  "sentiment_weighted_twitter_1h_v2",
  "sentiment_weighted_twitter_v2",
  "sentiment_weighted_youtube_videos_1d_v2",
  "sentiment_weighted_youtube_videos_1h_v2",
  "sentiment_weighted_youtube_videos_v2"
]
metrics = Enum.map(metrics_list, fn m -> "getMetric|#{m}" end)

sql = """
WITH san_team_user_ids AS ( select id from santiment_team_members ) 
SELECT
  distinct(user_id),
  count(*) AS calls_count
FROM api_call_data
WHERE
  dt >= now() - interval 60 day
  AND user_id NOT IN san_team_user_ids
  AND user_id != 0
  AND query IN ({{metrics}})
GROUP BY user_id
ORDER BY calls_count DESC
"""

params = %{metrics: metrics}
struct = Sanbase.Clickhouse.Query.new(sql, params)

{:ok, result} =
  Sanbase.ClickhouseRepo.query_transform(struct, fn [id, calls] ->
    %{user_id: id, calls_count: calls}
  end)
import Ecto.Query
user_ids = Enum.map(result, & &1.user_id)

users =
  from(u in Sanbase.Accounts.User, where: u.id in ^user_ids)
  |> Sanbase.Repo.all()
  |> Map.new(&{&1.id, &1})

Enum.map(result, fn map ->
  user = users[map.user_id]
  subscriptions = Sanbase.Billing.Subscription.user_subscription_names(user)

  map
  |> Map.put(:subscriptions, subscriptions)
  |> Map.put(:email, user.email)
end)