Перейти к основному содержимому

Фильтрация

Узлы и грани

Для фильтрации результатов запросы должны отправляться через поле пути edges.

При работе с массивами данных может потребоваться уточнить запрос, оставив в ответе только те данные, которые соответствуют текущим интересам. Для этого можно воспользоваться инструментами фильтрации возвращаемых данных.


Аргумент фильтрации

Данные можно отфильтровать по характеристикам возвращаемых объектов. Для этих целей используется аргумент корневого поля пути where.

В качестве фильтра используются группы входных данных XModelFilterInput, где X — имя интерфейса, данные которого используются для фильтрации:

  • InstrumentModelFilterInput — фильтры интерфейса Instrument
  • BondFilterInput — фильтры интерфейса Bond
  • DerivativeFilterInput — фильтры интерфейса Derivative
  • StockFilterInput — фильтры интерфейса Stock

Так, например, в качестве фильтров для интерфейса Instrument можно использовать поля пути basicInformation, currencyInformation, tradingDetails, financialAttributes, boardInformation и additionalInformation, а также все входящие в них поля данных.


Входные значения

В качестве значения фильтр может ожидать как случайное значение, соответствующее формату входных данных, так и одно из предзаданных значений из схемы. Так, согласно схеме, для фильтрации по полю symbol ожидается тикер в строковом формате (например, "SBER"), тогда как для поля market потребуется привести одно из значений списка enum Market.

Пример схемы

"""
Список возможных фильтров для поля BasicInformation
"""
input BasicInformationFilterInput {
and: [BasicInformationFilterInput!]
or: [BasicInformationFilterInput!]
symbol: StringOperationFilterInput
exchange: ExchangeOperationFilterInput
description: StringOperationFilterInput
shortName: StringOperationFilterInput
Тип финансового инструмента
type: StringOperationFilterInput
market: MarketOperationFilterInput
}

"""
Список возможных ключей для поля market
"""
input MarketOperationFilterInput {
eq: Market
neq: Market
in: [Market!]
nin: [Market!]
}

"""
Список возможных значений для поля market
"""
enum Market {
FOND
CURR
FORTS
SPBX
UNITED
BE
INFO
ITS
}

Ключи фильтрации

Каждый фильтр сопровождается ключом, определяющим совпадение фактического значения поля с заданным. Полный перечень ключей зависит от схемы выбранного поля. Ключи могут быть следующими:

  • eq/neq — фактическое значение (не) равно указанному
  • contains/ncontains — фактическое значение (не) содержит указанное
  • in/nin — фактическое значение (не) входит в список значений
  • startsWith/nstartsWith — фактическое значение (не) начинается с указанного
  • endsWith/nendsWith — фактическое значение (не) заканчивается указанным
Пример запроса
{
instruments(where: { basicInformation: { symbol: { contains: "SBER" } } }) {
edges {
node {
basicInformation {
symbol
...
}
}
}
}
}
Пример ответа
{
"data": {
"instruments": {
"edges": [
{
"node": {
"basicInformation": {
"symbol": "SBER",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP300424CE310",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP080524CE320",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP150524PE310",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP080524CE310",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP300424PE290",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP300424CE320",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP150524CE320",
...
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP080524PE310",
...
}
}
}
]
}
}
}

Группировка фильтров

Фильтры можно группировать с помощью логических операторов для получения более точных данных. Доступны два оператора:

  • and — выполняться должны все заданные фильтры
  • or — выполняться должен хотя бы один из заданных фильтров
Пример запроса
{
instruments(where: { and: [ { basicInformation: { symbol: { contains: "SBER" } market: { eq: FOND } } } ] }) {
edges {
node {
basicInformation {
symbol
...
market
}
}
}
}
}
Пример ответа
{
"data": {
"instruments": {
"edges": [
{
"node": {
"basicInformation": {
"symbol": "SBER",
...
"market": "FOND"
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBERP",
...
"market": "FOND"
}
}
},
{
"node": {
"basicInformation": {
"symbol": "SBER-ME",
...
"market": "FOND"
}
}
}
]
}
}
}

Группируемые фильтры должны соответствовать схеме как в написании, так и структурно. При этом дополнительный фильтр можно добавить как отдельным объектом, так и как часть уже существующего (только если используются разные поля данных). Например, оба следующих варианта записи фильтров будут верны:

Пример запроса
{
instruments(where: { and: [ { basicInformation: { symbol: { contains: "SBER" } market: { eq: FOND } } } ] }) {
edges {
node {
basicInformation {
...
}
}
}
}
}
Пример запроса
{
instruments(where: { and: [ { basicInformation: { symbol: { contains: "SBER" } } } { basicInformation: {market: { eq: FOND }}} ] }) {
edges {
node {
basicInformation {
...
}
}
}
}
}

Логические операторы можно комбинировать для увеличения вариативности выборки:

Пример запроса
{
instruments(where: {
and: [ { basicInformation: { symbol: { contains: "SBER" } } } { or: [ { basicInformation: { market: { eq: FOND } } } { basicInformation: { market: { eq: FORTS } } } ] } ] }) {
edges {
node {
basicInformation {
symbol
...
market
}
}
}
}
}

В ответ система вернёт все объекты, в которых будет найдено значение SBER в поле symbol и значение поля market которых будет равно FOND или FORTS (пример такого ответа есть выше).

Группа из одного

Логические операторы and и or можно использовать даже с одним фильтром. Это не окажет никакого эффекта на результаты выдачи, но и не вызовет ошибку в обработке запроса.


Фильтрация по спискам значений

Ключи фильтрации in/nin, в отличии от других ключей, ожидают получить не одиночное значение, а целый список, с которым будет проводиться сравнение. Доступность этого ключа для выбранного поля и допустимые значения и их формат определяются схемой.

Чтобы добавить список значений для сравнения с фактическими значениями полей, заключите все интересующие значения в квадратные скобки [ ]:

Пример запроса
{
instruments(where: { and: [ { basicInformation: { symbol: { contains: "SBER" } } } { basicInformation: { market: { in: [FOND FORTS] } } } ] }) {
edges {
node {
basicInformation {
...
}
}
}
}
}

В ответ система вернёт все объекты, в которых будет найдено значение SBER в поле symbol и значение поля market будет совпадать с одним из указанных в списке значений — FOND или FORTS (пример такого ответа есть выше).


Что дальше?