Условия фильтрации передаются списком `FilterContainer`: `{ NextFilterLogicOperationType, FilterType, Value }`.
`FilterType` определяет вид фильтра (таблица ниже), `Value` — его параметры в формате, специфичном для конкретного `FilterType`.
## Глобальные фильтры
| FilterType | Назначение |
| --- | --- |
| `RouteFilter` | Фильтр по дорогам. Для сущностей, связанных с дорогами (интерфейс `IRoutIdEntity`), фильтрует по полю `routeId`. Для самой сущности дороги (`Route`) ищет указанные Id в полях `Id` и `JunctionId` (через ИЛИ). |
| `RegionFilter` | Фильтр по регионам. Для сущности региона (`Region`) ищет указанные Id в поле `Id`. Для прочих геометрических сущностей берёт геометрию указанных регионов и фильтрует по пересечению (`Intersect`). |
| `PolygonFilter` | Геометрический фильтр по полигонам. Работает только для геометрических сущностей — ищет вхождение в полигон (`Intersect`). |
| `GeometryAttributeFilter` | Фильтр по типам геометрии (`Point`/`Polygon`/`Linestring`). Работает только для геометрических сущностей. Указанный тип считается эквивалентным своему `Multi`-варианту (например, `Point` включает и `MultiPoint`). |
| `DataSourceGeometryFilter` | Фильтр по геометрии сущностей другого источника данных. Значение — список объектов ``{ DataSourceId, Filter (вложенный список `FilterContainer` для сущности этого источника), GeometryOperationType, Buffer, FilterBuffer }``. `GeometryOperationType` задаёт геометрическое отношение (`Intersects`/`Contains`/`Disjoint`/`Equals`/`Touches`/`Covers`/`Within`) между текущей сущностью (с буфером `Buffer`) и геометриями отфильтрованных сущностей источника (с буфером `FilterBuffer`). Работает только для геометрических сущностей; источник не может фильтровать сам себя. |
| `PropertyFilter` | Фильтрация по значениям полей сущности. При фильтрации по полям-словарям указывается имя поля-идентификатора (например, `BusStopTypeId`), а не значение классификатора. |
| `ProjectFilter` | Фильтр по проектам. Для сущностей, связанных с проектами (интерфейс `IProjectEntity`), фильтрует по полю `ProjectId`. |
## Логические операции
Между фильтрами (`NextFilterLogicOperationType`) и между условиями внутри `PropertyFilter` (`NextLogicOperationType`) допустимы: `And`, `Or`.
Эти поля можно передавать как `null` (или опускать), если фильтр единственный либо последний в цепочке.
## Типы операций PropertyFilter (OperationType)
| OperationType | Описание | Ограничения |
| --- | --- | --- |
| `Eq` | Равно (сравнение 1:1). | Все типы полей; допускает явный `null`. |
| `Neq` | Не равно. | Как `Eq`, с отрицанием. |
| `Lt` / `Le` | Меньше / меньше или равно. | Недопустимо для `String` и `Guid`; `null` не допускается и строки со значением `null` из БД не учитываются. |
| `Gt` / `Ge` | Больше / больше или равно. | Недопустимо для `String` и `Guid`; `null` не допускается. |
| `In` / `NIn` | Вхождение в массив значений (аналог `Eq`/`Neq` по массиву). | `In` — неявное ИЛИ между значениями, `NIn` — неявное И. |
| `Like` / `NLike` | Подстрока (аналог `contains`), регистронезависимо. | Только `String`; `null` не допускается. |
| `StartWith` / `NStartWith` | Начинается с подстроки. | Только `String`; `null` не допускается. |
| `EndWith` / `NEndWith` | Заканчивается подстрокой. | Только `String`; `null` не допускается. |
## Пример фильтра
```json
[
{ "NextFilterLogicOperationType": "And", "FilterType": "RouteFilter", "Value": ["3d8b5e7c-7637-4c52-a51b-7e1cf10d04e7"] },
{ "NextFilterLogicOperationType": "And", "FilterType": "ProjectFilter", "Value": ["3d8b5e7c-7637-4c52-a51b-7e1cf10d04e7"] },
{ "NextFilterLogicOperationType": "And", "FilterType": "RegionFilter", "Value": ["3d8b5e7c-7637-4c52-a51b-7e1cf10d04e7"] },
{ "NextFilterLogicOperationType": "And", "FilterType": "PolygonFilter", "Value": { "Srid": 4326, "Geometries": [ { "type": "Polygon", "coordinates": [[[55.893821,49.333641],[55.891733,49.328927],[55.899957,49.316499],[55.90215,49.322116],[55.893821,49.333641]]] } ] } },
{ "NextFilterLogicOperationType": "And", "FilterType": "GeometryAttributeFilter", "Value": { "type": ["Point", "Polygon"] } },
{ "NextFilterLogicOperationType": "Or", "FilterType": "DataSourceGeometryFilter", "Value": [ { "DataSourceId": "3d8b5e7c-7637-4c52-a51b-7e1cf10d04e7", "GeometryOperationType": "Intersects", "Buffer": 0, "FilterBuffer": 0, "Filter": [] } ] },
{ "NextFilterLogicOperationType": "And", "FilterType": "PropertyFilter", "Value": [
{ "NextLogicOperationType": "Or", "PropertyName": "Name", "OperationType": "Eq", "Value": "Andrey" },
{ "NextLogicOperationType": "And", "PropertyName": "Name", "OperationType": "Like", "Value": "I" },
{ "NextLogicOperationType": "And", "PropertyName": "Name", "OperationType": "StartWith", "Value": "I" },
{ "NextLogicOperationType": "And", "PropertyName": "Name", "OperationType": "EndWith", "Value": "y" },
{ "NextLogicOperationType": "And", "PropertyName": "Number", "OperationType": "Gt", "Value": "10" },
{ "NextLogicOperationType": "Or", "PropertyName": "Number", "OperationType": "Lt", "Value": "100" },
{ "NextLogicOperationType": "None","PropertyName": "NumberUrns", "OperationType": "In", "Value": ["5","8","10"] }
] }
]
```
> Пример показывает все семь `FilterType` и все семь условий `PropertyFilter` в виде валидного JSON без `//`-комментариев и висячих запятых.
## Правила и ограничения
Обработка ошибок фильтрации строгая — нарушение контракта приводит к ошибке запроса:
- Вызов без `filterId` предфильтрации и без самой фильтрации возвращает все данные (актуально только внутри бэкенда).
- Некорректный JSON в значении контейнера фильтра вызывает ошибку.
- Отсутствующий `FilterType` (`null`) вызывает ошибку.
- `NextFilterLogicOperationType` со значением `null` в середине логической цепочки вызывает ошибку.
- Некорректный JSON в `Value` вызывает ошибку.
- Все значения (числа, даты) передаются строками — для единообразия.