Skip to content

Commit

Permalink
Add getLabelBasedMetricOwners API
Browse files Browse the repository at this point in the history
  • Loading branch information
IvanIvanoff committed Aug 3, 2023
1 parent 5493921 commit f8cab0e
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 3 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
/.history/
!.env.example
!app/.env
.elixir-tools/

# Generated on crash by the VM
erl_crash.dump
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
defmodule Sanbase.Clickhouse.Exchanges.ExchangeMetric do
defmodule Sanbase.Clickhouse.Exchanges do
alias Sanbase.Clickhouse.MetricAdapter.FileHandler

import Sanbase.Metric.SqlQuery.Helper, only: [asset_id_filter: 2, additional_filters: 3]

require Sanbase.ClickhouseRepo, as: ClickhouseRepo

@name_to_metric_map FileHandler.name_to_metric_map()
@table_map FileHandler.table_map()

def top_exchanges_by_balance(%{slug: slug_or_slugs}, limit, opts \\ []) do
filters = Keyword.get(opts, :additional_filters, [])
query_struct = top_exchanges_by_balance_query(slug_or_slugs, limit, filters)
Expand All @@ -24,8 +29,41 @@ defmodule Sanbase.Clickhouse.Exchanges.ExchangeMetric do
)
end

def owners_by_slug_and_metric(metric, slug) do
table = Map.get(@table_map, metric)

case not is_nil(table) && table =~ "label" do
true ->
query_struct =
owners_by_slug_and_metric_query(metric, slug)
|> IO.inspect(label: "38", limit: :infinity)

ClickhouseRepo.query_transform(query_struct, fn [owner] -> owner end)

false ->
{:error, "The provided metric #{metric} is not a label-based metric"}
end
end

# Private functions

defp owners_by_slug_and_metric_query(metric, slug) do
params = %{
metric: Map.get(@name_to_metric_map, metric),
slug: slug
}

sql = """
SELECT DISTINCT owner
FROM #{Map.get(@table_map, metric)}
WHERE
metric_id = get_metric_id({{metric}})
#{if slug, do: "AND asset_id = get_asset_id({{slug}})"}
"""

Sanbase.Clickhouse.Query.new(sql, params)
end

defp top_exchanges_by_balance_query(slug_or_slugs, limit, filters) do
params = %{slug: slug_or_slugs, limit: limit}

Expand Down
2 changes: 1 addition & 1 deletion lib/sanbase/run_examples.ex
Original file line number Diff line number Diff line change
Expand Up @@ -641,7 +641,7 @@ defmodule Sanbase.RunExamples do
)

{:ok, _} =
Sanbase.Clickhouse.Exchanges.ExchangeMetric.top_exchanges_by_balance(
Sanbase.Clickhouse.Exchanges.top_exchanges_by_balance(
%{slug: "ethereum"},
1,
additional_filters: [
Expand Down
6 changes: 5 additions & 1 deletion lib/sanbase_web/graphql/resolvers/exchange_resolver.ex
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,10 @@ defmodule SanbaseWeb.Graphql.Resolvers.ExchangeResolver do
ExchangeAddress.exchange_names(slug, Map.get(args, :is_dex, nil))
end

def get_label_based_metric_owners(_root, %{metric: metric} = args, _resolution) do
Exchanges.owners_by_slug_and_metric(metric, args[:slug])
end

def top_exchanges_by_balance(
_root,
args,
Expand All @@ -26,7 +30,7 @@ defmodule SanbaseWeb.Graphql.Resolvers.ExchangeResolver do
end

with {:ok, selector} <- Sanbase.Project.Selector.args_to_selector(args),
{:ok, result} <- Exchanges.ExchangeMetric.top_exchanges_by_balance(selector, limit, opts) do
{:ok, result} <- Exchanges.top_exchanges_by_balance(selector, limit, opts) do
{:ok, result}
end
|> maybe_handle_graphql_error(fn error ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,18 @@ defmodule SanbaseWeb.Graphql.Schema.BlockchainMetricQueries do
cache_resolve(&ClickhouseResolver.daily_active_deposits/3)
end

@desc ~s"""
List all exchanges
"""
field :get_label_based_metric_owners, list_of(:string) do
meta(access: :free)

arg(:metric, non_null(:string))
arg(:slug, :string)

cache_resolve(&ExchangeResolver.get_label_based_metric_owners/3)
end

@desc "List all exchanges"
field :all_exchanges, list_of(:string) do
meta(access: :free)
Expand Down

0 comments on commit f8cab0e

Please sign in to comment.