Improve performance

This commit is contained in:
Sunli 2020-10-24 08:59:35 +08:00
parent 1a8f432383
commit 11e82e56e4

View File

@ -157,29 +157,33 @@ impl<'a> Fields<'a> {
async move { async move {
let ctx_field = ctx.with_field(field); let ctx_field = ctx.with_field(field);
let field_name = ctx_field.item.node.response_key().node.clone(); let field_name = ctx_field.item.node.response_key().node.clone();
let res = if ctx_field.query_env.extensions.is_empty() {
let ctx_extension = ExtensionContext { let ctx_extension = ExtensionContext {
schema_data: &ctx.schema_env.data, schema_data: &ctx.schema_env.data,
query_data: &ctx.query_env.ctx_data, query_data: &ctx.query_env.ctx_data,
}; };
let type_name = T::type_name();
let resolve_info = ResolveInfo { let resolve_info = ResolveInfo {
resolve_id: ctx_field.resolve_id, resolve_id: ctx_field.resolve_id,
path_node: ctx_field.path_node.as_ref().unwrap(), path_node: ctx_field.path_node.as_ref().unwrap(),
parent_type: &T::type_name(), parent_type: &type_name,
return_type: match ctx_field return_type: match ctx_field
.schema_env .schema_env
.registry .registry
.types .types
.get(T::type_name().as_ref()) .get(type_name.as_ref())
.and_then(|ty| ty.field_by_name(field.node.name.node.as_str())) .and_then(|ty| {
ty.field_by_name(field.node.name.node.as_str())
})
.map(|field| &field.ty) .map(|field| &field.ty)
{ {
Some(ty) => &ty, Some(ty) => &ty,
None => { None => {
return Err(ServerError::new(format!( return Err(ServerError::new(format!(
r#"Cannot query field "{}" on type "{}"."#, r#"Cannot query field "{}" on type "{}"."#,
field_name, field_name, type_name
T::type_name()
)) ))
.at(ctx_field.item.pos) .at(ctx_field.item.pos)
.path(PathSegment::Field(field_name.to_string()))); .path(PathSegment::Field(field_name.to_string())));
@ -193,8 +197,10 @@ impl<'a> Fields<'a> {
.resolve_start(&ctx_extension, &resolve_info); .resolve_start(&ctx_extension, &resolve_info);
let res = match root.resolve_field(&ctx_field).await { let res = match root.resolve_field(&ctx_field).await {
Ok(value) => Ok((field_name, value.unwrap())), Ok(value) => Ok((field_name, value.unwrap_or_default())),
Err(e) => Err(e.path(PathSegment::Field(field_name.to_string()))), Err(e) => {
Err(e.path(PathSegment::Field(field_name.to_string())))
}
} }
.log_error(&ctx_extension, &ctx_field.query_env.extensions)?; .log_error(&ctx_extension, &ctx_field.query_env.extensions)?;
@ -203,6 +209,16 @@ impl<'a> Fields<'a> {
.extensions .extensions
.resolve_end(&ctx_extension, &resolve_info); .resolve_end(&ctx_extension, &resolve_info);
res
} else {
match root.resolve_field(&ctx_field).await {
Ok(value) => Ok((field_name, value.unwrap_or_default())),
Err(e) => {
Err(e.path(PathSegment::Field(field_name.to_string())))
}
}?
};
Ok(res) Ok(res)
} }
})); }));