1个稳定版本
1.0.0 | 2024年5月21日 |
---|
#570 在 数据库接口
375KB
9K SLoC
graphql_query
超级快速且易于使用的GraphQL查询语言处理。
graphql_query 库遵循两个目标
- 支持令人愉悦的GraphQL查询语言的API
- 在处理GraphQL查询语言AST时非常快速
简而言之,惊喜! graphql_query
crate在处理GraphQL的一部分时,并不旨在支持完整的、服务器端的GraphQL执行或GraphQL模式语言。服务器端执行的许多部分都是一次性操作。解析模式和使用它可能是使用参考GraphQL.js实现进行预处理操作。
更难的是优化单个GraphQL请求的处理方式,并使其更容易在易于使用的AST之上编写复杂代码。GraphQL吞吐量对于确保GraphQL不落后于任何其他解决方案至关重要,这些解决方案没有丰富的查询语言。此外,同时拥有易于使用且包含足够原语和实用工具的AST库,同时在构建完整的GraphQL服务器时重视性能,这是一件更难的事情。
因此,这个库专注于仅处理GraphQL查询,用于中间的GraphQL层,这些层在GraphQL客户端和GraphQL服务器之间操作。
示例代码
库目前包括解析、打印、验证、访问和转换GraphQL查询语言AST的实用工具。
use graphql_query::{ast::*, validate::*};
let ctx = ASTContext::new();
let ast = Document::parse(&ctx, "{ field }").unwrap();
DefaultRules::validate(&ctx, &ast).unwrap()
let output = ast.print();
性能
这个库在实现这个目标方面进展如何? 正中靶心。
在M1 Macbook Pro上进行的基准测试
解析
test graphql_ast_parse_graphql_query ... bench: 2,886 ns/iter (+/- 130)
test graphql_ast_parse_graphql_parser ... bench: 25,122 ns/iter (+/- 1,711)
test graphql_ast_parse_apollo_parser ... bench: 36,242 ns/iter (+/- 1,062)
打印
test graphql_ast_print_graphql_query ... bench: 1,082 ns/iter (+/- 79)
test graphql_ast_print_gql_parser ... bench: 1,137 ns/iter (+/- 48)
test graphql_ast_print_apollo_parser ... bench: 20,861 ns/iter (+/- 518)
其他
test graphql_ast_fold ... bench: 8,466 ns/iter (+/- 768)
test graphql_ast_validate ... bench: 2,339 ns/iter (+/- 127)
test graphql_load_introspection ... bench: 90,265 ns/iter (+/- 4,899)
这里没有的东西
- SDL实现
- 模式感知的验证规则,但可以通过我们的schema_reference完全实现
execute
/collectFields
算法 - 故意如此,因为我们专注于执行语言
依赖关系
~5.5MB
~62K SLoC