У меня есть сервер GraphQL, который может обслуживать данные таймсерий для указанного источника (например, данные датчика). Пример запроса для получения данных для датчика может быть таким:
query fetchData {
timeseriesData(sourceId: "source1") {
data {
time
value
}
}
}
В моем интерфейсе я хочу разрешить пользователю выбирать 1 или несколько источников и показывать диаграмму с линией для каждого из них. Похоже, это можно было бы сделать с помощью такого запроса:
query fetchData {
series1: timeseriesData(sourceId: "source1") {
data {
time
value
}
}
series2: timeseriesData(sourceId: "source2") {
data {
time
value
}
}
}
Большинство руководств по GraphQL, похоже, сосредоточены на статических запросах (например, когда изменяется только переменная, но не фактическая форма запроса), но в моем случае мне нужно, чтобы запрос был динамический (один запрос timeseriesData для каждого из выбранных мной идентификаторов).
У меня есть следующие ограничения:
- Изменение схемы сервера не является вариантом (поэтому, например, я не могу передать массив идентификаторов в преобразователь)
- Мой запрос указан с использованием строки шаблона, например. gql` ... `
- Я не хочу вручную создавать запрос в виде строки, потому что это похоже на рецепт катастрофы и будет означать, что я потеряю все преимущества инструментов (например, автозаполнение, подсветка синтаксиса, линтинг)
Стек, который я использую:
- Клиент Apollo (в частности, apollo-angular)
- Угловой
- Машинопись
- graphql-tag (для определения запросов)
В идеале я хочу каким-то образом объединить два запроса в один, чтобы я мог определить их в соответствии с первым примером, но затем объединить их вместе на уровне абстракции, чтобы получить один запрос, подобный второму примеру, для быть отправленным по проводам.
Однако я не уверен, как этого добиться, потому что graphql-tag анализирует запрос в AST, и я изо всех сил пытаюсь понять, возможно ли манипулировать запросом таким образом.
Какие существуют методы для создания подобного динамического запроса, когда форма запроса неизвестна заранее?