graphql-将多个解析器的结果合并为一个

时间:2019-04-16 21:50:16

标签: merge graphql aggregation graphql-java

我在服务器端有一组函数,每个函数根据传递给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
...

我想在解析器的结果之间执行逻辑与,即找出不同解析器的结果中的公共对象。

我只需要合并的列表,而不是获取单个列表。

一种方法是在客户端汇总结果,但这将增加服务器发送的重复数据量。

在服务器端实现此目标的最佳方法是什么?架构需要哪些更改?

--------------------编辑--------------------

数据源是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)->返回dateCreated在范围内的obj的列表 typeResolver(String [] type)->返回obj的列表,其类型是在数组中传递的任何值。

2 个答案:

答案 0 :(得分:0)

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

query {
  objListQuery {
    objResolver(params1, params2, constraint) {
      ...
    }
  }
}

像这样,您可以创建一个直接获取正确结果的数据库查询,或者可以执行多个查询并在objResolver内解决它们。如果constraint始终为AND,则可以保留该参数,但是也许您想提供也使用ORXOR或其他参数的可能性。

如果参数集的数量始终为2,则就像我上面的代码一样简单,还考虑了可选约束。如果参数集的数量可能是可变的,即4或5,那么如果您仍然想提供约束参数,那就变得越来越复杂。如果没有约束参数,这很简单,您可以注意到没有参数的函数,但是要检查调用方中参数的数量并相应地进行处理,在调用方中,您只需要使用很多参数即可。

query {
  objListQuery {
    objResolver() {
      paramArray = getArguments();
    }
  }
}

就像上面写的那样,如果您仍然想在此处提供约束参数,那么这将变得越来越困难,但是我建议这对于另一个问题将是重要的。

答案 1 :(得分:0)

您可以使用单个解析器实现Connection接口,以允许单步查询机制。您可以使用此技术减少查询端点。

例如,查询示例如下:

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: []
  }
)
  • 随着需求的增长添加新的条件。从您想要的东西开始,然后从那里开始。