Merge 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

我在服务器端有一组函数,每个函数都根据传递给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(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
   }
}
在解析器中,可以使用此条件准备和返回数据

好处:

  • 更少的查询端点
  • 过滤和分页

    您的过滤器界面可能非常奇特:

  • 随着需求的增长,添加新的标准。从你想要的开始,然后从那里开始

将方案聚合到单个方案中,并调用此聚合方案中的每个旋转器有多种方法可实现此目的,最适合您的方法是基于所获取数据的确切性质。您能否更具体地描述模式,比如两个不同的解析器在做什么?参数有什么不同?hazardous添加了一个示例用例。多个参数可以属于一个解析器。这将导致组合分解器中的参数列表非常大,并且参数的顺序将难以维护。此外,如果某个解析器不用于特定情况,该怎么办?然后,必须在组合解析程序中传递空值。此外,数据源是JSON数组,而不是数据库。即使您知道所有的用例,也需要一些时间才能使一切顺利进行,但也许您可以解释“如果某个解析程序不用于特定情况”的含义如果你总是使用1个或2个以上的参数,如果你想提供约束条件等,如果你没有详细的需求知识,很难回答详细的问题。
allObjects(
  dateCreated: {
    between:{
      start, 
      end
    }, 
    skipWeekends: true
  }, 
  types: {
    include:[], 
    exclude: []
  }
)