fix(labrinth): fix filtering not working unless breakdown set to same field (#6608)

* fix(labrinth): return columns used in filters

fixes modrinth/code#6607

* chore(labrinth): sqlx query data update

* don't implicitly breakdown when filtering by a metric

* fix docs

---------

Co-authored-by: aecsocket <43144841+aecsocket@users.noreply.github.com>
This commit is contained in:
penguinencounter
2026-07-12 11:31:56 +02:00
committed by GitHub
co-authored by aecsocket
parent e1556a8ee3
commit 7c4df7442b
5 changed files with 120 additions and 24 deletions
@@ -376,18 +376,39 @@ pub(crate) async fn fetch(
let use_columns = &[
("use_project_id", uses(F::ProjectId)),
("use_domain", uses(F::Domain)),
(
"use_domain",
uses(F::Domain) || !metrics.filter_by.domain.is_empty(),
),
(
"use_user_agent",
uses(F::UserAgent) || !metrics.filter_by.user_agent.is_empty(),
),
("use_version_id", uses(F::VersionId)),
(
"use_version_id",
uses(F::VersionId) || !metrics.filter_by.version_id.is_empty(),
),
("use_dependent_project_id", uses(F::DependentProjectId)),
("use_monetized", uses(F::Monetized)),
("use_country", uses(F::Country)),
("use_reason", uses(F::Reason)),
("use_game_version", uses(F::GameVersion)),
("use_loader", uses(F::Loader)),
(
"use_monetized",
uses(F::Monetized) || !metrics.filter_by.monetized.is_empty(),
),
(
"use_country",
uses(F::Country) || !metrics.filter_by.country.is_empty(),
),
(
"use_reason",
uses(F::Reason) || !metrics.filter_by.reason.is_empty(),
),
(
"use_game_version",
uses(F::GameVersion) || !metrics.filter_by.game_version.is_empty(),
),
(
"use_loader",
uses(F::Loader) || !metrics.filter_by.loader.is_empty(),
),
];
let mut query = cx
@@ -453,7 +474,7 @@ pub(crate) async fn fetch(
bucket: row.bucket,
project_id: row.project_id,
domain: uses_column("use_domain").then(|| row.domain.clone()),
user_agent: uses(F::UserAgent)
user_agent: uses_column("use_user_agent")
.then_some(normalized_source)
.flatten(),
version_id: uses_column("use_version_id").then_some(row.version_id),
@@ -505,6 +526,30 @@ pub(crate) async fn fetch(
) {
continue;
}
if !uses(F::Domain) {
key.domain = None;
}
if !uses(F::UserAgent) {
key.user_agent = None;
}
if !uses(F::VersionId) {
key.version_id = None;
}
if !uses(F::Monetized) {
key.monetized = None;
}
if !uses(F::Country) {
key.country = None;
}
if !uses(F::Reason) {
key.reason = None;
}
if !uses(F::GameVersion) {
key.game_version = None;
}
if !uses(F::Loader) {
key.loader = None;
}
*output_buckets.entry(key).or_default() += downloads;
}
@@ -184,10 +184,22 @@ pub(crate) async fn fetch(
let uses = |field| metrics.bucket_by.contains(&field);
let use_columns = &[
("use_project_id", uses(F::ProjectId)),
("use_version_id", uses(F::VersionId)),
("use_loader", uses(F::Loader)),
("use_game_version", uses(F::GameVersion)),
("use_country", uses(F::Country)),
(
"use_version_id",
uses(F::VersionId) || !metrics.filter_by.version_id.is_empty(),
),
(
"use_loader",
uses(F::Loader) || !metrics.filter_by.loader.is_empty(),
),
(
"use_game_version",
uses(F::GameVersion) || !metrics.filter_by.game_version.is_empty(),
),
(
"use_country",
uses(F::Country) || !metrics.filter_by.country.is_empty(),
),
];
let uses_column = |name| {
use_columns
@@ -265,6 +277,18 @@ pub(crate) async fn fetch(
) {
continue;
}
if !uses(F::VersionId) {
key.version_id = None;
}
if !uses(F::Loader) {
key.loader = None;
}
if !uses(F::GameVersion) {
key.game_version = None;
}
if !uses(F::Country) {
key.country = None;
}
*output_buckets.entry(key).or_default() += seconds;
}
@@ -143,10 +143,22 @@ pub(crate) async fn fetch(
let uses = |field| metrics.bucket_by.contains(&field);
let use_columns = &[
("use_project_id", uses(F::ProjectId)),
("use_domain", uses(F::Domain)),
("use_site_path", uses(F::SitePath)),
("use_monetized", uses(F::Monetized)),
("use_country", uses(F::Country)),
(
"use_domain",
uses(F::Domain) || !metrics.filter_by.domain.is_empty(),
),
(
"use_site_path",
uses(F::SitePath) || !metrics.filter_by.site_path.is_empty(),
),
(
"use_monetized",
uses(F::Monetized) || !metrics.filter_by.monetized.is_empty(),
),
(
"use_country",
uses(F::Country) || !metrics.filter_by.country.is_empty(),
),
];
let uses_column = |name| {
use_columns
@@ -211,6 +223,18 @@ pub(crate) async fn fetch(
) {
continue;
}
if !uses(F::Domain) {
key.domain = None;
}
if !uses(F::SitePath) {
key.site_path = None;
}
if !uses(F::Monetized) {
key.monetized = None;
}
if !uses(F::Country) {
key.country = None;
}
*output_buckets.entry(key).or_default() += views;
}