Adds ordering on loader fields enum (#755)

* now sorts on ordering, fmt clippy prepare

* fixed tests

* removed accidenetal printlns
This commit is contained in:
Wyatt Verchere
2023-11-13 18:19:06 -08:00
committed by GitHub
parent ae1c5342f2
commit 375f992a0c
11 changed files with 56 additions and 32 deletions

View File

@@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable \n FROM loader_field_enums lfe\n WHERE lfe.enum_name = $1\n ", "query": "\n SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable \n FROM loader_field_enums lfe\n WHERE lfe.enum_name = $1\n ORDER BY lfe.ordering ASC\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@@ -36,5 +36,5 @@
false false
] ]
}, },
"hash": "0b52dc08a903a9c82234f6e1a2c59fdb631955011988910f033dd740b6a3b79b" "hash": "1243d13d622a9970240c8f26b5031b4c68d08607f7a0142b662b53eb05b4723a"
} }

View File

@@ -1,6 +1,6 @@
{ {
"db_name": "PostgreSQL", "db_name": "PostgreSQL",
"query": "\n SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values\n WHERE enum_id = ANY($1)\n ", "query": "\n SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values\n WHERE enum_id = ANY($1)\n ORDER BY enum_id, ordering, created DESC\n ",
"describe": { "describe": {
"columns": [ "columns": [
{ {
@@ -48,5 +48,5 @@
false false
] ]
}, },
"hash": "458630d00e46183c65f95729d2647d3635f629cfb892fc8ac1964d8ecc269576" "hash": "603eaa54b3956d68f656008e9b04f1c352857cf2eb15874cee9d31f8d992ab77"
} }

View File

@@ -341,6 +341,7 @@ impl LoaderFieldEnum {
SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable SELECT lfe.id, lfe.enum_name, lfe.ordering, lfe.hidable
FROM loader_field_enums lfe FROM loader_field_enums lfe
WHERE lfe.enum_name = $1 WHERE lfe.enum_name = $1
ORDER BY lfe.ordering ASC
", ",
enum_name enum_name
) )
@@ -393,7 +394,7 @@ impl LoaderFieldEnumValue {
let enum_ids = loader_fields let enum_ids = loader_fields
.iter() .iter()
.filter_map(|x| get_enum_id(x)) .filter_map(get_enum_id)
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let values = Self::list_many(&enum_ids, exec, redis) let values = Self::list_many(&enum_ids, exec, redis)
.await? .await?
@@ -444,6 +445,7 @@ impl LoaderFieldEnumValue {
" "
SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values SELECT id, enum_id, value, ordering, metadata, created FROM loader_field_enum_values
WHERE enum_id = ANY($1) WHERE enum_id = ANY($1)
ORDER BY enum_id, ordering, created DESC
", ",
&remaining_enums &remaining_enums
) )
@@ -465,7 +467,7 @@ impl LoaderFieldEnumValue {
let cachable_enum_sets: Vec<(LoaderFieldEnumId, Vec<LoaderFieldEnumValue>)> = result let cachable_enum_sets: Vec<(LoaderFieldEnumId, Vec<LoaderFieldEnumValue>)> = result
.clone() .clone()
.into_iter() .into_iter()
.group_by(|x| x.enum_id) .group_by(|x| x.enum_id) // we sort by enum_id, so this will group all values of the same enum_id together
.into_iter() .into_iter()
.map(|(k, v)| (k, v.collect::<Vec<_>>().to_vec())) .map(|(k, v)| (k, v.collect::<Vec<_>>().to_vec()))
.collect(); .collect();

View File

@@ -77,7 +77,7 @@ impl LegacyProject {
// V2 versions only have one project type- v3 versions can rarely have multiple. // V2 versions only have one project type- v3 versions can rarely have multiple.
// We'll just use the first one. // We'll just use the first one.
let mut project_type = data.project_types.get(0).cloned().unwrap_or_default(); let mut project_type = data.project_types.first().cloned().unwrap_or_default();
let mut loaders = data.loaders; let mut loaders = data.loaders;
if let Some(versions_item) = versions_item { if let Some(versions_item) = versions_item {
@@ -174,7 +174,7 @@ impl LegacyProject {
{ {
let version_ids: Vec<_> = data let version_ids: Vec<_> = data
.iter() .iter()
.filter_map(|p| p.versions.get(0).map(|i| (*i).into())) .filter_map(|p| p.versions.first().map(|i| (*i).into()))
.collect(); .collect();
let example_versions = version_item::Version::get_many(&version_ids, exec, redis).await?; let example_versions = version_item::Version::get_many(&version_ids, exec, redis).await?;
let mut legacy_projects = Vec::new(); let mut legacy_projects = Vec::new();

View File

@@ -179,7 +179,7 @@ async fn find_version(
// Try to parse version filters from version coords. // Try to parse version filters from version coords.
let Some((vnumber, filter)) = vcoords.rsplit_once('-') else { let Some((vnumber, filter)) = vcoords.rsplit_once('-') else {
return Ok(exact_matches.get(0).map(|x| (*x).clone())); return Ok(exact_matches.first().map(|x| (*x).clone()));
}; };
let db_loaders: HashSet<String> = Loader::list(pool, redis) let db_loaders: HashSet<String> = Loader::list(pool, redis)
@@ -221,8 +221,8 @@ async fn find_version(
.collect::<Vec<_>>(); .collect::<Vec<_>>();
Ok(matched Ok(matched
.get(0) .first()
.or_else(|| exact_matches.get(0)) .or_else(|| exact_matches.first())
.copied() .copied()
.cloned()) .cloned())
} }

View File

@@ -13,7 +13,7 @@ pub fn get_color_from_img(data: &[u8]) -> Result<Option<u32>, ImageError> {
.crop_imm(128, 128, 64, 64); .crop_imm(128, 128, 64, 64);
let color = color_thief::get_palette(image.to_rgb8().as_bytes(), ColorFormat::Rgb, 10, 2) let color = color_thief::get_palette(image.to_rgb8().as_bytes(), ColorFormat::Rgb, 10, 2)
.ok() .ok()
.and_then(|x| x.get(0).copied()) .and_then(|x| x.first().copied())
.map(|x| (x.r as u32) << 16 | (x.g as u32) << 8 | (x.b as u32)); .map(|x| (x.r as u32) << 16 | (x.g as u32) << 8 | (x.b as u32));
Ok(color) Ok(color)

View File

@@ -34,7 +34,7 @@ pub fn validation_errors_to_string(errors: ValidationErrors, adder: Option<Strin
output output
} }
ValidationErrorsKind::Field(errors) => { ValidationErrorsKind::Field(errors) => {
if let Some(error) = errors.get(0) { if let Some(error) = errors.first() {
if let Some(adder) = adder { if let Some(adder) = adder {
output.push_str(&format!( output.push_str(&format!(
"Field {} {} failed validation with error: {}", "Field {} {} failed validation with error: {}",

View File

@@ -20,7 +20,7 @@ use super::{environment::TestEnvironment, request_data::get_public_project_creat
use super::{asserts::assert_status, database::USER_USER_ID, get_json_val_str}; use super::{asserts::assert_status, database::USER_USER_ID, get_json_val_str};
pub const DUMMY_DATA_UPDATE: i64 = 3; pub const DUMMY_DATA_UPDATE: i64 = 5;
#[allow(dead_code)] #[allow(dead_code)]
pub const DUMMY_CATEGORIES: &[&str] = &[ pub const DUMMY_CATEGORIES: &[&str] = &[

View File

@@ -34,16 +34,22 @@ INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) SE
-- Sample game versions, loaders, categories -- Sample game versions, loaders, categories
-- Game versions is '2' -- Game versions is '2'
INSERT INTO loader_field_enum_values(enum_id, value, metadata) INSERT INTO loader_field_enum_values(enum_id, value, metadata, created)
VALUES (2, '1.20.1', '{"type":"release","major":false}'); VALUES (2, '1.20.1', '{"type":"release","major":false}', '2021-08-18 15:48:58.435729+00');
INSERT INTO loader_field_enum_values(enum_id, value, metadata) INSERT INTO loader_field_enum_values(enum_id, value, metadata, created)
VALUES (2, '1.20.2', '{"type":"release","major":false}'); VALUES (2, '1.20.2', '{"type":"release","major":false}', '2021-08-18 15:48:59.435729+00');
INSERT INTO loader_field_enum_values(enum_id, value, metadata) INSERT INTO loader_field_enum_values(enum_id, value, metadata, created)
VALUES (2, '1.20.3', '{"type":"release","major":false}'); VALUES (2, '1.20.3', '{"type":"release","major":false}', '2021-08-18 15:49:00.435729+00');
INSERT INTO loader_field_enum_values(enum_id, value, metadata) INSERT INTO loader_field_enum_values(enum_id, value, metadata, created)
VALUES (2, '1.20.4', '{"type":"beta","major":false}'); VALUES (2, '1.20.4', '{"type":"beta","major":false}', '2021-08-18 15:49:01.435729+00');
INSERT INTO loader_field_enum_values(enum_id, value, metadata) INSERT INTO loader_field_enum_values(enum_id, value, metadata, created)
VALUES (2, '1.20.5', '{"type":"release","major":true}'); VALUES (2, '1.20.5', '{"type":"release","major":true}', '2061-08-18 15:49:02.435729+00');
-- Also add 'Ordering_Negative1' and 'Ordering_Positive100' to game versions (to test ordering override)
INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering)
VALUES (2, 'Ordering_Negative1', '{"type":"release","major":false}', -1);
INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering)
VALUES (2, 'Ordering_Positive100', '{"type":"release","major":false}', 100);
INSERT INTO loader_fields_loaders(loader_id, loader_field_id) INSERT INTO loader_fields_loaders(loader_id, loader_field_id)
SELECT l.id, lf.id FROM loaders l CROSS JOIN loader_fields lf WHERE lf.field = 'game_versions' OR lf.field = 'client_side' OR lf.field = 'server_side'; SELECT l.id, lf.id FROM loaders l CROSS JOIN loader_fields lf WHERE lf.field = 'game_versions' OR lf.field = 'client_side' OR lf.field = 'server_side';

View File

@@ -1,3 +1,5 @@
use itertools::Itertools;
use crate::common::environment::TestEnvironment; use crate::common::environment::TestEnvironment;
use std::collections::HashSet; use std::collections::HashSet;
@@ -13,17 +15,31 @@ async fn get_tags() {
let side_types = api.get_side_types_deserialized().await; let side_types = api.get_side_types_deserialized().await;
let categories = api.get_categories_deserialized().await; let categories = api.get_categories_deserialized().await;
// These tests match dummy data and will need to be updated if the dummy data changes; // These tests match dummy data and will need to be updated if the dummy data changes
// Versions should be ordered by:
// - ordering
// - ordering ties settled by date added to database
// - We also expect presentation of NEWEST to OLDEST
// - All null orderings are treated as older than any non-null ordering
// (for this test, the 1.20.1, etc, versions are all null ordering)
let game_version_versions = game_versions let game_version_versions = game_versions
.into_iter() .into_iter()
.map(|x| x.version) .map(|x| x.version)
.collect::<HashSet<_>>(); .collect::<Vec<_>>();
assert_eq!( assert_eq!(
game_version_versions, game_version_versions,
["1.20.1", "1.20.2", "1.20.3", "1.20.4", "1.20.5"] [
.iter() "Ordering_Negative1",
.map(|s| s.to_string()) "Ordering_Positive100",
.collect() "1.20.5",
"1.20.4",
"1.20.3",
"1.20.2",
"1.20.1"
]
.iter()
.map(|s| s.to_string())
.collect_vec()
); );
let loader_names = loaders.into_iter().map(|x| x.name).collect::<HashSet<_>>(); let loader_names = loaders.into_iter().map(|x| x.name).collect::<HashSet<_>>();

View File

@@ -266,7 +266,7 @@ async fn test_patch_project_team_member() {
let req = test::TestRequest::post() let req = test::TestRequest::post()
.uri(&format!("/v2/team/{alpha_team_id}/members")) .uri(&format!("/v2/team/{alpha_team_id}/members"))
.append_header(("Authorization", USER_USER_PAT)) .append_header(("Authorization", USER_USER_PAT))
.set_json(&json!({ .set_json(json!({
"user_id": FRIEND_USER_ID, "user_id": FRIEND_USER_ID,
"permissions": (ProjectPermissions::EDIT_MEMBER | ProjectPermissions::EDIT_BODY).bits(), "permissions": (ProjectPermissions::EDIT_MEMBER | ProjectPermissions::EDIT_BODY).bits(),
})) }))
@@ -408,7 +408,7 @@ async fn test_patch_organization_team_member() {
let req = test::TestRequest::post() let req = test::TestRequest::post()
.uri(&format!("/v2/team/{zeta_team_id}/members")) .uri(&format!("/v2/team/{zeta_team_id}/members"))
.append_header(("Authorization", USER_USER_PAT)) .append_header(("Authorization", USER_USER_PAT))
.set_json(&json!({ .set_json(json!({
"user_id": FRIEND_USER_ID, "user_id": FRIEND_USER_ID,
"organization_permissions": (OrganizationPermissions::EDIT_MEMBER | OrganizationPermissions::EDIT_MEMBER_DEFAULT_PERMISSIONS).bits(), "organization_permissions": (OrganizationPermissions::EDIT_MEMBER | OrganizationPermissions::EDIT_MEMBER_DEFAULT_PERMISSIONS).bits(),
})).to_request(); })).to_request();