Skip to content

Commit f8b6388

Browse files
StatsHandler : stocke des statistiques pour les réutilisations (#4483)
1 parent b4d7384 commit f8b6388

File tree

4 files changed

+105
-31
lines changed

4 files changed

+105
-31
lines changed

apps/transport/lib/db/reuse.ex

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ defmodule DB.Reuse do
3434
many_to_many(:datasets, DB.Dataset, join_through: "reuse_dataset", on_replace: :delete)
3535
end
3636

37+
def base_query, do: from(r in __MODULE__, as: :reuse)
38+
3739
def changeset(model, attrs) do
3840
model
3941
|> cast(attrs, [

apps/transport/lib/transport/stats_handler.ex

+27-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ defmodule Transport.StatsHandler do
1919
end
2020

2121
defp store_stat_history(key, values, %DateTime{} = timestamp)
22-
when key in [:gtfs_rt_types, :climate_resilience_bill_count, :count_geo_data_lines] do
22+
when key in [:gtfs_rt_types, :climate_resilience_bill_count, :count_geo_data_lines, :reuses] do
2323
Enum.map(values, fn {type, count} ->
2424
store_stat_history("#{key}::#{type}", count, timestamp)
2525
end)
@@ -88,7 +88,8 @@ defmodule Transport.StatsHandler do
8888
climate_resilience_bill_count: count_datasets_climate_resilience_bill(),
8989
nb_siri: count_dataset_with_format("SIRI"),
9090
nb_siri_lite: count_dataset_with_format("SIRI Lite"),
91-
count_geo_data_lines: count_geo_data_lines()
91+
count_geo_data_lines: count_geo_data_lines(),
92+
reuses: reuses_stats()
9293
}
9394
|> Map.merge(gbfs_stats())
9495
end
@@ -191,6 +192,30 @@ defmodule Transport.StatsHandler do
191192
|> Enum.into(%{})
192193
end
193194

195+
def reuses_stats do
196+
reuses_by_type =
197+
DB.Reuse.base_query()
198+
|> group_by([reuse: r], r.type)
199+
|> select([reuse: r], {r.type, count(r.id)})
200+
|> DB.Repo.all()
201+
|> Enum.into(%{})
202+
203+
reuses_metrics_sum =
204+
DB.Reuse.base_query()
205+
|> select([reuse: r], %{
206+
sum_metric_discussions: sum(r.metric_discussions),
207+
sum_metric_followers: sum(r.metric_followers),
208+
sum_metric_views: sum(r.metric_views)
209+
})
210+
|> DB.Repo.one()
211+
212+
%{
213+
nb_reuses: DB.Repo.aggregate(DB.Reuse.base_query(), :count, :id)
214+
}
215+
|> Map.merge(reuses_by_type)
216+
|> Map.merge(reuses_metrics_sum)
217+
end
218+
194219
defp count_datasets_climate_resilience_bill do
195220
DB.Dataset.base_query()
196221
|> where([dataset: d], "loi-climat-resilience" in d.custom_tags)

apps/transport/test/support/factory.ex

+28
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ defmodule DB.Factory do
4141
nom: "Grenoble",
4242
siren: "253800825",
4343
region: build(:region),
44+
population: 1_000,
4445
# The value must be unique, ExFactory helps us with a named sequence
4546
composition_res_id: 1000 + sequence("composition_res_id", & &1)
4647
}
@@ -337,6 +338,33 @@ defmodule DB.Factory do
337338
}
338339
end
339340

341+
def reuse_factory do
342+
%DB.Reuse{
343+
datagouv_id: sequence(:datagouv_id, &"datagouv_id-#{&1}"),
344+
title: sequence(:title, &"Reuse Title #{&1}"),
345+
slug: sequence(:slug, &"reuse-slug-#{&1}"),
346+
url: sequence(:url, &"http://example.com/reuse/#{&1}"),
347+
type: "api",
348+
description: "A description of the reuse.",
349+
remote_url: sequence(:remote_url, &"http://remote.example.com/reuse/#{&1}"),
350+
organization: "Example Organization",
351+
organization_id: sequence(:organization_id, &"org-#{&1}"),
352+
owner: "Example Owner",
353+
owner_id: sequence(:owner_id, &"owner-#{&1}"),
354+
image: sequence(:image, &"http://example.com/image/#{&1}.jpg"),
355+
featured: false,
356+
archived: false,
357+
topic: "transport_and_mobility",
358+
tags: ["tag1", "tag2"],
359+
metric_discussions: 0,
360+
metric_datasets: 0,
361+
metric_followers: 0,
362+
metric_views: 0,
363+
created_at: DateTime.utc_now(),
364+
last_modified: DateTime.utc_now()
365+
}
366+
end
367+
340368
def insert_contact(%{} = args \\ %{}) do
341369
%{
342370
first_name: "John",

apps/transport/test/transport/stats_handler_test.exs

+48-29
Original file line numberDiff line numberDiff line change
@@ -47,39 +47,17 @@ defmodule Transport.StatsHandlerTest do
4747
end
4848

4949
test "climate_resilience_bill_count" do
50-
aom = insert(:aom, population: 1_000)
51-
insert(:dataset, aom: aom, is_active: false, custom_tags: ["loi-climat-resilience"], type: "public-transit")
52-
insert(:dataset, aom: aom, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
53-
insert(:dataset, aom: aom, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
54-
55-
insert(:dataset,
56-
aom: aom,
57-
is_active: true,
58-
custom_tags: ["loi-climat-resilience", "foo"],
59-
type: "low-emission-zones"
60-
)
50+
insert(:dataset, is_active: false, custom_tags: ["loi-climat-resilience"], type: "public-transit")
51+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
52+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
53+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience", "foo"], type: "low-emission-zones")
6154

6255
assert %{
6356
climate_resilience_bill_count: %{
6457
"low-emission-zones" => 1,
6558
"public-transit" => 2
6659
}
6760
} = compute_stats()
68-
69-
# Stored as expected in the database
70-
store_stats()
71-
72-
decimal_1 = Decimal.new(1)
73-
decimal_2 = Decimal.new(2)
74-
75-
assert [
76-
%DB.StatsHistory{metric: "climate_resilience_bill_count::low-emission-zones", value: ^decimal_1},
77-
%DB.StatsHistory{metric: "climate_resilience_bill_count::public-transit", value: ^decimal_2}
78-
] =
79-
DB.StatsHistory
80-
|> where([s], like(s.metric, "climate_resilience_bill_count%"))
81-
|> order_by([s], s.metric)
82-
|> DB.Repo.all()
8361
end
8462

8563
test "store_stats" do
@@ -98,6 +76,16 @@ defmodule Transport.StatsHandlerTest do
9876
resource_id: insert(:resource, format: "gbfs").id
9977
)
10078

79+
# climate_resilience_bill data
80+
insert(:dataset, is_active: false, custom_tags: ["loi-climat-resilience"], type: "public-transit")
81+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
82+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience"], type: "public-transit")
83+
insert(:dataset, is_active: true, custom_tags: ["loi-climat-resilience", "foo"], type: "low-emission-zones")
84+
85+
# reuses stats
86+
insert(:reuse, type: "api", metric_discussions: 0, metric_followers: 2, metric_views: 5)
87+
insert(:reuse, type: "visualization", metric_discussions: 1, metric_followers: 1, metric_views: 10)
88+
10189
stats = compute_stats()
10290
store_stats()
10391
assert DB.Repo.aggregate(DB.StatsHistory, :count, :id) >= Enum.count(stats)
@@ -109,18 +97,33 @@ defmodule Transport.StatsHandlerTest do
10997
|> Map.keys()
11098
|> Enum.map(&to_string/1)
11199
|> Enum.reject(
112-
&String.starts_with?(&1, ["gtfs_rt_types", "climate_resilience_bill_count", "count_geo_data_lines"])
100+
&String.starts_with?(&1, ["gtfs_rt_types", "climate_resilience_bill_count", "count_geo_data_lines", "reuses"])
113101
)
114102

115103
assert MapSet.subset?(MapSet.new(stats_metrics), MapSet.new(all_metrics))
116104
assert Enum.member?(all_metrics, "gtfs_rt_types::vehicle_positions")
117105
assert Enum.member?(all_metrics, "gtfs_rt_types::trip_updates")
118106
assert Enum.member?(all_metrics, "count_geo_data_lines::irve")
107+
assert Enum.member?(all_metrics, "reuses::nb_reuses")
119108

120-
expected = Decimal.new("2")
109+
expected = Decimal.new(2)
121110
assert %{value: ^expected} = DB.Repo.get_by!(DB.StatsHistory, metric: "gtfs_rt_types::vehicle_positions")
122-
expected = Decimal.new("1")
111+
expected = Decimal.new(1)
123112
assert %{value: ^expected} = DB.Repo.get_by!(DB.StatsHistory, metric: "gbfs_v3.0_count")
113+
expected = Decimal.new(15)
114+
assert %{value: ^expected} = DB.Repo.get_by!(DB.StatsHistory, metric: "reuses::sum_metric_views")
115+
116+
decimal_1 = Decimal.new(1)
117+
decimal_2 = Decimal.new(2)
118+
119+
assert [
120+
%DB.StatsHistory{metric: "climate_resilience_bill_count::low-emission-zones", value: ^decimal_1},
121+
%DB.StatsHistory{metric: "climate_resilience_bill_count::public-transit", value: ^decimal_2}
122+
] =
123+
DB.StatsHistory
124+
|> where([s], like(s.metric, "climate_resilience_bill_count%"))
125+
|> order_by([s], s.metric)
126+
|> DB.Repo.all()
124127
end
125128

126129
test "count dataset per format" do
@@ -251,4 +254,20 @@ defmodule Transport.StatsHandlerTest do
251254
} == gbfs_stats()
252255
end
253256
end
257+
258+
test "reuses_stats" do
259+
insert(:reuse, type: "api", metric_discussions: 0, metric_followers: 2, metric_views: 5)
260+
insert(:reuse, type: "visualization", metric_discussions: 1, metric_followers: 1, metric_views: 10)
261+
262+
assert %{
263+
:nb_reuses => 2,
264+
:sum_metric_discussions => 1,
265+
:sum_metric_followers => 3,
266+
:sum_metric_views => 15,
267+
"api" => 1,
268+
"visualization" => 1
269+
} = reuses_stats = reuses_stats()
270+
271+
assert %{reuses: ^reuses_stats} = compute_stats()
272+
end
254273
end

0 commit comments

Comments
 (0)