如何编写解析器,以便我可以在每个解析器中生成数据库子查询并有效地组合所有解析器并一次获取数据?
对于以下架构:
type Node {
index: Int!
color: String!
neighbors(first: Int = null): [Node!]!
}
type Query {
nodes(color: String!): [Node!]!
}
schema {
query: Query
}
执行以下查询:
{
nodes(color: "red") {
index
neighbors(first: 5) {
index
}
}
}
数据存储:
在我的数据存储中,节点和邻居存储在单独的表中。我想写一个解析器,以便我们可以最佳地获取所需的数据。
如果有任何类似的例子,请分享详细信息。 (参考graphql-java获得答案会很有帮助)
答案 0 :(得分:0)
推荐且最常见的方法是使用data loader
。
data loader
收集有关fields
加载哪些table
以及要使用的where
过滤器的信息。
我没有在Java中使用GraphQL,所以我只能告诉你如何自己实现它。
context
参数传递给解析器。 table name
,field names
列表和where conditions
列表传递给数据加载器并返回一个承诺。 remove duplicate field
使用combine the where conditions
关键字命名并or
。or
关键字组合条件)答案 1 :(得分:0)
DataFetchingEnvironment
可通过DataFetchingEnvironment#getSelectionSet
访问子选项。这意味着,在您的情况下,您可以从nodes
解析器中了解到neighbors
也是必需的,因此您可以JOIN
正确地准备结果。
getSelectionSet
当前实施的一个限制是,它不提供条件选择的信息。因此,如果您正在处理接口和联合,则必须从DataFetchingEnvironment#getField
开始手动收集子选择。这在graphql-java的未来版本中很可能会得到改进。