将来自多个旋转变压器的结果合并为一个



我在服务器端有一组函数,每个函数根据传递给 GraphQL 查询中解析器的参数返回相同类型的对象列表-

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(字符串开始日期,字符串结束日期)->返回日期创建在范围内的 obj 列表 typeResolver(String[] type) -> 返回 obj 的列表,其类型是数组中传递的任何值。

假设您正在使用数据库,那么您以某种方式询问如何在控制器级别上将约束从数据库层或存储库层转移。
虽然这在模型级别上可能有一些弱点,但它可能取决于类实现,如果你可以轻松地更改objResolver,就像你只构建一个允许更多参数的那种

,如下所示:
query {
objListQuery {
objResolver(params1, params2, constraint) {
...
}
}
}

像这样,您可以创建一个直接获取正确结果的数据库查询,或者您可以执行多个查询并在objResolver中解决它们。如果constraint总是AND你可以省略参数,但也许你喜欢提供使用ORXOR或其他参数的可能性。

如果参数集的数量始终为 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: []
}
)
  • 随着需求的增长添加新标准。从你想要的开始,然后从那里拿走。

最新更新