Improve performance

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

View File

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