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 { 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 ctx_extension = ExtensionContext {
schema_data: &ctx.schema_env.data,
query_data: &ctx.query_env.ctx_data,
};
let resolve_info = ResolveInfo { let res = if ctx_field.query_env.extensions.is_empty() {
resolve_id: ctx_field.resolve_id, let ctx_extension = ExtensionContext {
path_node: ctx_field.path_node.as_ref().unwrap(), schema_data: &ctx.schema_env.data,
parent_type: &T::type_name(), query_data: &ctx.query_env.ctx_data,
return_type: match ctx_field };
.schema_env
.registry let type_name = T::type_name();
.types let resolve_info = ResolveInfo {
.get(T::type_name().as_ref()) resolve_id: ctx_field.resolve_id,
.and_then(|ty| ty.field_by_name(field.node.name.node.as_str())) path_node: ctx_field.path_node.as_ref().unwrap(),
.map(|field| &field.ty) parent_type: &type_name,
{ return_type: match ctx_field
Some(ty) => &ty, .schema_env
None => { .registry
return Err(ServerError::new(format!( .types
r#"Cannot query field "{}" on type "{}"."#, .get(type_name.as_ref())
field_name, .and_then(|ty| {
T::type_name() ty.field_by_name(field.node.name.node.as_str())
)) })
.at(ctx_field.item.pos) .map(|field| &field.ty)
.path(PathSegment::Field(field_name.to_string()))); {
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) Ok(res)
} }
})); }));