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

Фильтрация

Узлы и грани

Для фильтрации результатов запросы должны отправляться через поле пути 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 (пример такого ответа есть выше).


Что дальше?​