修复字符串数字筛选比较
让后台表格筛选同时解析实际值与期望值中的字符串数字 补充字符串化数字范围筛选回归测试
This commit is contained in:
@@ -3536,12 +3536,15 @@ fn admin_database_filter_operator_matches(
|
||||
|
||||
// 数值优先、字符串兜底的比较,兼容后台单元格的字符串化值。
|
||||
fn compare_admin_database_filter_values(actual: &Value, expected: &Value) -> Option<Ordering> {
|
||||
let actual_number = actual
|
||||
.as_f64()
|
||||
.or_else(|| actual.as_str().and_then(|value| value.trim().parse().ok()));
|
||||
let expected_number = expected.as_f64().or_else(|| {
|
||||
expected
|
||||
.as_str()
|
||||
.and_then(|value| value.trim().parse().ok())
|
||||
});
|
||||
if let (Some(actual_number), Some(expected_number)) = (actual.as_f64(), expected_number) {
|
||||
if let (Some(actual_number), Some(expected_number)) = (actual_number, expected_number) {
|
||||
if actual_number.is_finite() && expected_number.is_finite() {
|
||||
return actual_number.partial_cmp(&expected_number);
|
||||
}
|
||||
@@ -5702,6 +5705,31 @@ mod tests {
|
||||
assert_eq!(user_ids, vec!["u10", "u12"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn apply_admin_database_table_filters_compares_stringified_numeric_columns_numerically() {
|
||||
let columns = vec!["user_id".to_string(), "points".to_string()];
|
||||
let mut rows = vec![
|
||||
build_admin_database_table_row(&json!(["u2", "2"]), &columns),
|
||||
build_admin_database_table_row(&json!(["u10", "10"]), &columns),
|
||||
build_admin_database_table_row(&json!(["u12", "12"]), &columns),
|
||||
];
|
||||
|
||||
apply_admin_database_table_filters(
|
||||
&mut rows,
|
||||
&AdminDatabaseTableRowsQuery {
|
||||
filters: Some(json!([{"column": "points", "op": "gt", "value": "5"}]).to_string()),
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
.expect("stringified numeric range filters should compare numerically");
|
||||
|
||||
let user_ids = rows
|
||||
.iter()
|
||||
.filter_map(|row| row.cells.get("user_id").and_then(|value| value.as_str()))
|
||||
.collect::<Vec<_>>();
|
||||
assert_eq!(user_ids, vec!["u10", "u12"]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn apply_admin_database_table_filters_supports_list_and_negation_operators() {
|
||||
let columns: Vec<String> = ["user_id", "name", "points", "deleted_at"]
|
||||
|
||||
Reference in New Issue
Block a user