Skip to content

Commit 2dc14d7

Browse files
committed
Optimize EntityColumnId
1 parent 270bd8a commit 2dc14d7

File tree

3 files changed

+25
-31
lines changed

3 files changed

+25
-31
lines changed

src/builder_context/entity_column_id.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
use sea_orm::{EntityName, EntityTrait, IdenStatic};
2+
use std::borrow::Cow;
23

34
use crate::BuilderContext;
45

56
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
67
pub struct EntityColumnId {
7-
entity_name: String,
8-
column_name: String,
8+
entity_name: Cow<'static, str>,
9+
column_name: Cow<'static, str>,
910
}
1011

1112
impl EntityColumnId {
@@ -14,15 +15,15 @@ impl EntityColumnId {
1415
T: EntityTrait,
1516
{
1617
EntityColumnId {
17-
entity_name: <T as EntityName>::table_name(&T::default()).into(),
18-
column_name: column.as_str().into(),
18+
entity_name: Cow::Borrowed(<T as EntityName>::table_name(&T::default())),
19+
column_name: Cow::Borrowed(column.as_str()),
1920
}
2021
}
2122

2223
pub fn with_array(&self) -> Self {
2324
Self {
2425
entity_name: self.entity_name.clone(),
25-
column_name: format!("{}.array", self.column_name),
26+
column_name: Cow::Owned(format!("{}.array", self.column_name)),
2627
}
2728
}
2829

@@ -35,3 +36,9 @@ impl EntityColumnId {
3536
context.entity_object.column_name.as_ref()(&entity_name, &self.column_name)
3637
}
3738
}
39+
40+
impl std::fmt::Display for EntityColumnId {
41+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
42+
write!(f, "{}.{}", self.entity_name, self.column_name)
43+
}
44+
}

src/builder_context/filter_types_map.rs

Lines changed: 11 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use async_graphql::dynamic::{InputObject, InputValue, ObjectAccessor, TypeRef};
44
use sea_orm::{ColumnTrait, ColumnType, Condition, EntityTrait, ExprTrait};
55

66
use crate::{
7-
prepare_enumeration_condition, ActiveEnumFilterInputBuilder, BuilderContext,
8-
EntityObjectBuilder, SeaResult, TypesMapConfig, TypesMapHelper,
7+
prepare_enumeration_condition, ActiveEnumFilterInputBuilder, BuilderContext, EntityColumnId,
8+
EntityObjectBuilder, SeaResult, SeaographyError, TypesMapConfig, TypesMapHelper,
99
};
1010

1111
type FnFilterCondition =
@@ -14,9 +14,9 @@ type FnFilterCondition =
1414
/// The configuration for FilterTypesMapHelper
1515
pub struct FilterTypesMapConfig {
1616
/// used to map entity_name.column_name to a custom filter type
17-
pub overwrites: BTreeMap<String, Option<FilterType>>,
17+
pub overwrites: BTreeMap<EntityColumnId, Option<FilterType>>,
1818
/// used to map entity_name.column_name to a custom condition function
19-
pub condition_functions: BTreeMap<String, FnFilterCondition>,
19+
pub condition_functions: BTreeMap<EntityColumnId, FnFilterCondition>,
2020

2121
// basic filters
2222
pub string_filter_info: FilterInfo,
@@ -235,20 +235,9 @@ impl FilterTypesMapHelper {
235235
where
236236
T: EntityTrait,
237237
{
238-
let entity_object_builder = EntityObjectBuilder {
239-
context: self.context,
240-
};
241-
242-
let entity_name = entity_object_builder.type_name::<T>();
243-
let column_name = entity_object_builder.column_name::<T>(column);
238+
let entity_column_id = EntityColumnId::of::<T>(column);
244239

245-
// used to honor overwrites
246-
if let Some(ty) = self
247-
.context
248-
.filter_types
249-
.overwrites
250-
.get(&format!("{entity_name}.{column_name}"))
251-
{
240+
if let Some(ty) = self.context.filter_types.overwrites.get(&entity_column_id) {
252241
return ty.clone();
253242
}
254243

@@ -572,23 +561,19 @@ impl FilterTypesMapHelper {
572561
return prepare_enumeration_condition::<T>(filter, column, condition)
573562
}
574563
FilterType::Custom(_) => {
575-
let entity_object_builder = EntityObjectBuilder {
576-
context: self.context,
577-
};
578-
579-
let entity_name = entity_object_builder.type_name::<T>();
580-
let column_name = entity_object_builder.column_name::<T>(column);
564+
let entity_column_id = EntityColumnId::of::<T>(column);
581565

582566
if let Some(filter_condition_fn) = self
583567
.context
584568
.filter_types
585569
.condition_functions
586-
.get(&format!("{entity_name}.{column_name}"))
570+
.get(&entity_column_id)
587571
{
588572
return filter_condition_fn(condition, filter);
589573
} else {
590-
// FIXME: add log warning to console
591-
return Ok(condition);
574+
return Err(SeaographyError::CustomFilterError(
575+
entity_column_id.to_string(),
576+
));
592577
}
593578
}
594579
FilterType::Array(Some(filter_type)) => match *filter_type {

src/error.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ pub enum SeaographyError {
1212
TypeConversionError(String, String),
1313
#[error("[array conversion] postgres array can not be nested type of array")]
1414
NestedArrayConversionError,
15+
#[error("[custom filter] {0}")]
16+
CustomFilterError(String),
1517
#[error("[async_graphql] {0:?}")]
1618
UploadError(async_graphql::InputValueError<async_graphql::Upload>),
1719
}

0 commit comments

Comments
 (0)