graphql - объединяет результаты нескольких резольверов в один - PullRequest
2 голосов
/ 17 апреля 2019

У меня есть набор функций на стороне сервера, каждый из которых возвращает список объектов одного и того же типа на основе переданных параметров резольверам в запросе 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) -> возвращает список объектов obj, dateCreatedнаходится в пределах диапазона typeResolver (String [] type) -> возвращает список объектов obj, тип которых является любым из значений, переданных в массиве.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Вы можете реализовать интерфейс 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: []
  }
)
  • Добавляйте новые критерии по мере роста ваших потребностей. Начните с того, что вы хотите, и возьмите это оттуда.
0 голосов
/ 29 апреля 2019

Предполагается, что вы используете базу данных, и вы почему-то спрашиваете, как перенести ограничения с уровня базы данных или уровня хранилища на уровень контроллера.
Хотя это имеет некоторые недостатки на уровне модели, возможно, это может зависеть отРеализация класса, если вы можете легко изменить objResolver в том виде, в котором вы только что создали такой, который допускает большее количество параметров, таких как:

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

Таким образом, вы можете создать запрос к базе данных, который напрямую выбираетправильный результат или вы можете выполнить несколько запросов и разрешить их внутри objResolver.Если constraint всегда равно AND, вы можете оставить параметр в стороне, но, возможно, вы хотели бы предложить возможность использовать также OR, XOR или другие.

Если количество параметра-sets всегда 2, тогда это просто, как мой код выше, также с учетом необязательного ограничения.Если количество наборов параметров может быть переменным, то есть 4 или 5, то это становится сложным, если вы все еще хотите предложить параметр (ы) ограничения.Без ограничений-параметров это просто, вы могли бы просто отметить функцию без параметров, но проверить количество параметров в вызывающей стороне и обработать их соответствующим образом, в вызывающей программе вы просто используете столько параметров, сколько требуется.

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

Как написано выше, становится трудно, если вы все еще хотите предложить здесь ограничения-параметры, но я бы предположил, что это будет материал для другого вопроса.

...