Merge graphql-将多个解析器的结果合并为一个
我在服务器端有一组函数,每个函数都根据传递给GraphQL查询中解析程序的参数返回相同类型的对象列表-Merge graphql-将多个解析器的结果合并为一个,merge,graphql,aggregation,graphql-java,Merge,Graphql,Aggregation,Graphql Java,我在服务器端有一组函数,每个函数都根据传递给GraphQL查询中解析程序的参数返回相同类型的对象列表- query { objListQuery { objResolver1(params) { obj-id } objResolver2(different params) { obj-id } ... } } 在这里,objResolver1和objResolver2发回一个obj对象列表 服务器端- function objResolver
query {
objListQuery {
objResolver1(params) {
obj-id
}
objResolver2(different params) {
obj-id
}
...
}
}
在这里,objResolver1和objResolver2发回一个obj对象列表
服务器端-
function objResolver1(params) -> returns list of obj
function objResolver2(different params) -> returns list of obj
...
我想在冲突解决程序的结果之间执行逻辑AND,即在不同冲突解决程序的结果中查找公共对象
我只想要组合列表,而不是单个列表
一种方法是在客户端聚合结果,但这会增加服务器发送的重复数据量
在服务器端实现这一点的最佳方法是什么?架构中需要哪些更改
--------------------编辑--------------------
数据源是从服务器上的外部服务获取的obj对象的JSON数组。数据源不是数据库
每个解析器中的参数可以是一个或多个。它用于过滤对象。例如,数据存储的结构如下:
[
{"dateCreated":"2011-08-12T20:17:46.384Z",
"type":"customer",
....
},
{"dateCreated":"2011-08-14T20:17:46.384Z",
"type":"test",
....
}
]
分解器的形式如下:
dateResolver(String startDate,String endDate)->返回创建日期在范围内的obj列表
typeResolver(String[]type)->返回类型为数组中传递的任何值的obj列表。假设您使用的是数据库,您不知何故询问如何在控制器级别从数据库或存储库层转移约束。
虽然这在模型级别上可能有一些缺点,但如果您可以轻松地将
objResolver
更改为只构建一个允许更多参数的类型,则这可能取决于类实现:
query {
objListQuery {
objResolver(params1, params2, constraint) {
...
}
}
}
这样,您可以创建一个直接获取正确结果的数据库查询,也可以执行多个查询并在objResolver
中解析它们。如果约束
始终是和
,则可以不使用该参数,但您可能希望提供使用或
、异或
或其他参数的可能性
如果参数集的数量始终为2,则与上面的代码一样简单,同时考虑了可选约束。如果参数集的数量可能是可变的,即4或5,那么如果您仍然希望提供约束参数,则会变得复杂。没有约束参数很简单,您只需注意没有参数的函数,但检查调用者中的参数数量并相应地处理它们,在调用者中您只需根据需要使用如此多的参数
query {
objListQuery {
objResolver() {
paramArray = getArguments();
}
}
}
如上文所述,如果您仍然想在这里提供约束参数,这将变得很困难,但我建议这将是另一个问题的材料。您可以实现一个接口,使用一个解析器来允许一步查询机制。您可以使用此技术减少查询端点
例如,示例查询如下所示:
allObjects(start: "01-01-2019", end: "04-29-2019", types:["test", "sales"]){
nodes {
id,
dateCreated,
type
}
}
在解析器中,可以使用此条件准备和返回数据
好处:
- 更少的查询端点
- 过滤和分页 您的过滤器界面可能非常奇特:
- 随着需求的增长,添加新的标准。从你想要的开始,然后从那里开始
allObjects(
dateCreated: {
between:{
start,
end
},
skipWeekends: true
},
types: {
include:[],
exclude: []
}
)