-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAllPackageRequests.jl
419 lines (389 loc) · 14.1 KB
/
AllPackageRequests.jl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
module AllPackageRequests
using DataFrames
using Dates
using GenieFramework
using Format
using LibPQ
include("layout_shared.jl")
include("plots.jl")
include("utils.jl")
@vars AllPackageRequestsData begin
timeframe::String = "30d"
past_month_requests::String = "0"
past_week_requests::String = "0"
past_day_requests::String = "0"
total_downloads = plot_total_downloads(DataFrame(date=Date[], total_requests=Int[]))
julia_version_downloads = plot_julia_version_by_date(DataFrame(version=String[], date=Date[], total_requests=Int[]))
julia_version_proportion = plot_julia_version_proportion(DataFrame(version=String[], date=Date[], total_requests=Int[]))
region_downloads = plot_region_downloads(DataFrame(region=String[], date=Date[], total_requests=Int[]))
region_proportion = plot_region_proportion(DataFrame(region=String[], date=Date[], total_requests=Int[]))
julia_system_downloads = plot_julia_system_downloads(DataFrame(system=String[], date=Date[], total_requests=Int[]))
julia_system_proportion = plot_system_proportion(DataFrame(system=String[], date=Date[], total_requests=Int[]))
end
function get_request_count(
conn,
table,
timeframe,
group_cols;
user_data=true,
ci_data=false,
missing_data=false,
)
conditions = generate_sql_conditions(user_data, ci_data, missing_data)
group_cols_str = join(string.(group_cols), ", ")
if timeframe == "all"
timeframe = "100 years"
end
sql = """
WITH max_date AS (
SELECT MAX(date) AS max_date
FROM $table
)
SELECT $group_cols_str, SUM(request_count) AS total_requests
FROM $table
CROSS JOIN max_date
WHERE date > max_date - INTERVAL '$timeframe' $conditions
GROUP BY $group_cols_str
ORDER BY $group_cols_str DESC;
"""
return DataFrame(LibPQ.execute(conn, sql))
end
function ui()
[
layout_shared()...,
heading("All Packages"),
hr(style="border: 1px solid #ccc;"),
cell(class="controls-container", [
cell(class="control-item", [
label("Time Range", class="control-label"),
Stipple.select(:timeframe,
options=["30d", "60d", "120d", "all"],
class="select-input"
)
]),
cell(class="row", [
toggle("User", :user_data, val=true, color="green"),
toggle("CI", :ci_data, val=false, color="red"),
toggle("Misc", :missing_data, val=false, color="purple"),
])
]),
p("Downloads last month: {{ past_month_requests }}"),
p("Downloads last week: {{ past_week_requests }}") ,
p("Downloads last day: {{ past_day_requests }}"),
hr(style="border: 1px solid #ccc; margin: 5px 0;"),
GenieFramework.plotly(:total_downloads),
hr(style="border: 1px solid #ccc; margin: 20px 0;"),
GenieFramework.plotly(:julia_version_downloads),
GenieFramework.plotly(:julia_version_proportion),
hr(style="border: 1px solid #ccc; margin: 20px 0;"),
GenieFramework.plotly(:region_downloads),
GenieFramework.plotly(:region_proportion),
hr(style="border: 1px solid #ccc; margin: 20px 0;"),
GenieFramework.select(:selected_arch_os, options=:arch_os_options, style="width: 200px;"),
GenieFramework.plotly(:julia_system_downloads),
GenieFramework.plotly(:julia_system_proportion),
footer("The figures above represent unique IP address download counts for each package. The count might not fully reflect the actual downloads for packages with less frequent releases, and multiple counts could occur for users with dynamic IP addresses.", href="https://discourse.julialang.org/t/announcing-package-download-stats/69073")
]
end
const conn = LibPQ.Connection(conn_str)
const df_total_requests = get_request_count(
conn, "juliapkgstats.package_requests_by_date", "1 month", [:date]
)
const past_month_requests = format(sum(df_total_requests.total_requests); commas=true)
const past_week_requests = format(
sum(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", "1 week", [:date]
).total_requests,
);
commas=true,
)
const past_day_requests = format(
sum(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", "1 day", [:date]
).total_requests,
);
commas=true,
)
const df_julia_version_downloads = get_request_count(
conn, "juliapkgstats.julia_versions_by_date", "1 month", [:version, :date]
)
const total_downloads = plot_total_downloads(df_total_requests)
const julia_version_downloads = plot_julia_version_by_date(df_julia_version_downloads)
const julia_version_proportion = plot_julia_version_proportion(df_julia_version_downloads)
const df_region = get_request_count(
conn, "juliapkgstats.package_requests_by_region_by_date", "1 month", [:region, :date]
)
const region_downloads = plot_region_downloads(df_region)
const region_proportion = plot_region_proportion(df_region)
const df_julia_system_downloads = get_request_count(
conn, "juliapkgstats.julia_systems_by_date", "1 month", [:system, :date]
)
const julia_system_downloads = plot_julia_system_downloads(df_julia_system_downloads)
const julia_system_proportion = plot_system_proportion(df_julia_system_downloads)
close(conn)
@app begin
@in timeframe = "30d"
@in user_data = true
@in ci_data = false
@in missing_data = false
@in package_name_search = ""
@in selected_arch_os = "Full"
@out arch_os_options = ["Full", "CPU Arch", "OS"]
@out past_month_requests = "0"
@out past_week_requests = "0"
@out past_day_requests = "0"
@out total_downloads = plot_total_downloads(DataFrame(date=Date[], total_requests=Int[]))
@out julia_version_downloads = plot_julia_version_by_date(DataFrame(version=String[], date=Date[], total_requests=Int[]))
@out julia_version_proportion = plot_julia_version_proportion(DataFrame(version=String[], date=Date[], total_requests=Int[]))
@out region_downloads = plot_region_downloads(DataFrame(region=String[], date=Date[], total_requests=Int[]))
@out region_proportion = plot_region_proportion(DataFrame(region=String[], date=Date[], total_requests=Int[]))
@out julia_system_downloads = plot_julia_system_downloads(DataFrame(system=String[], date=Date[], total_requests=Int[]))
@out julia_system_proportion = plot_system_proportion(DataFrame(system=String[], date=Date[], total_requests=Int[]))
@onchange isready begin
@push
end
@onchange selected_arch_os begin
conn = LibPQ.Connection(conn_str)
julia_system_downloads = plot_julia_system_downloads(
get_request_count(
conn,
"juliapkgstats.julia_systems_by_date",
timeframe,
[:system, :date];
user_data,
ci_data,
missing_data,
),
selected_arch_os
)
julia_system_proportion = plot_system_proportion(
get_request_count(
conn,
"juliapkgstats.julia_systems_by_date",
timeframe,
[:system, :date];
user_data,
ci_data,
missing_data,
),
selected_arch_os
)
close(conn)
end
@onchange timeframe, user_data, ci_data, missing_data begin
@info "Change in timeframe or checkboxes (timeframe: $timeframe, user_data: $user_data, ci_data: $ci_data, missing_data: $missing_data)"
conn = LibPQ.Connection(conn_str)
# Update statistics
past_month_requests = format(
sum(
get_request_count(
conn,
"juliapkgstats.package_requests_by_date",
"30d",
[:date];
user_data,
ci_data,
missing_data,
).total_requests,
);
commas=true,
)
past_week_requests = format(
sum(
get_request_count(
conn,
"juliapkgstats.package_requests_by_date",
"7d",
[:date];
user_data,
ci_data,
missing_data,
).total_requests,
);
commas=true,
)
past_day_requests = format(
sum(
get_request_count(
conn,
"juliapkgstats.package_requests_by_date",
"1d",
[:date];
user_data,
ci_data,
missing_data,
).total_requests,
);
commas=true,
)
# Update plots
total_downloads = plot_total_downloads(
get_request_count(
conn,
"juliapkgstats.package_requests_by_date",
timeframe,
[:date];
user_data,
ci_data,
missing_data,
),
)
julia_version_downloads = plot_julia_version_by_date(
get_request_count(
conn,
"juliapkgstats.julia_versions_by_date",
timeframe,
[:version, :date];
user_data,
ci_data,
missing_data,
),
)
julia_version_proportion = plot_julia_version_proportion(
get_request_count(
conn,
"juliapkgstats.julia_versions_by_date",
timeframe,
[:version, :date];
user_data,
ci_data,
missing_data,
),
)
region_downloads = plot_region_downloads(
get_request_count(
conn,
"juliapkgstats.package_requests_by_region_by_date",
timeframe,
[:region, :date];
user_data,
ci_data,
missing_data,
),
)
region_proportion = plot_region_proportion(
get_request_count(
conn,
"juliapkgstats.package_requests_by_region_by_date",
timeframe,
[:region, :date];
user_data,
ci_data,
missing_data,
),
)
julia_system_downloads = plot_julia_system_downloads(
get_request_count(
conn,
"juliapkgstats.julia_systems_by_date",
timeframe,
[:system, :date];
user_data,
ci_data,
missing_data,
),
selected_arch_os
)
julia_system_proportion = plot_system_proportion(
get_request_count(
conn,
"juliapkgstats.julia_systems_by_date",
timeframe,
[:system, :date];
user_data,
ci_data,
missing_data,
),
selected_arch_os
)
close(conn)
@push
end
end
route("/all"; method=GET) do
conn = LibPQ.Connection(conn_str)
timeframe = "30d" # Default timeframe
past_month_requests = format(
sum(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", "30d", [:date]
).total_requests,
);
commas=true,
)
past_week_requests = format(
sum(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", "7d", [:date]
).total_requests,
);
commas=true,
)
past_day_requests = format(
sum(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", "1d", [:date]
).total_requests,
);
commas=true,
)
# Initial plots with default timeframe
total_downloads = plot_total_downloads(
get_request_count(
conn, "juliapkgstats.package_requests_by_date", timeframe, [:date]
),
)
julia_version_downloads = plot_julia_version_by_date(
get_request_count(
conn, "juliapkgstats.julia_versions_by_date", timeframe, [:version, :date]
),
)
julia_version_proportion = plot_julia_version_proportion(
get_request_count(
conn, "juliapkgstats.julia_versions_by_date", timeframe, [:version, :date]
),
)
region_downloads = plot_region_downloads(
get_request_count(
conn,
"juliapkgstats.package_requests_by_region_by_date",
timeframe,
[:region, :date],
),
)
region_proportion = plot_region_proportion(
get_request_count(
conn,
"juliapkgstats.package_requests_by_region_by_date",
timeframe,
[:region, :date],
),
)
julia_system_downloads = plot_julia_system_downloads(
get_request_count(
conn, "juliapkgstats.julia_systems_by_date", timeframe, [:system, :date]
),
)
julia_system_proportion = plot_system_proportion(
get_request_count(
conn, "juliapkgstats.julia_systems_by_date", timeframe, [:system, :date]
),
)
close(conn)
model = @init
model.timeframe[] = timeframe
model.past_month_requests[] = past_month_requests
model.past_week_requests[] = past_week_requests
model.past_day_requests[] = past_day_requests
model.total_downloads[] = total_downloads
model.julia_version_downloads[] = julia_version_downloads
model.julia_version_proportion[] = julia_version_proportion
model.region_downloads[] = region_downloads
model.region_proportion[] = region_proportion
model.julia_system_downloads[] = julia_system_downloads
model.julia_system_proportion[] = julia_system_proportion
html(page(model, ui()))
end
end