- PVSM.RU - https://www.pvsm.ru -

OData REST API и рекурсивные запросы

В дискуссии к предыдущей [1]статье dezconnect [2]поднял интересный вопрос о возможностях OData выполнять рекурсивные запросы (по аналогии с SQL CTE).

В документации OData [3] в разделе 11.2.4.2 описывается опция запроса $expand. Эта опция позволяет получать объекты вместе со связанными объектами. Например, Вы можете получить данные о компании вместе со всеми данными о ее президенте:
http://nitrosdata.com/service/testdb/company(company1)?$expand=president [4]

Без опции $expand результат будет включать только id президента компании (или ссылку при других настройках).
http://nitrosdata.com/service/testdb/company(company1) [5]

В 4й версии OData существенно расширены возможности опции $expand для выполнения рекурсивных запросов.

Например, у человека есть друзья, у них в свою очередь тоже есть друзья и мы хотим получить все дерево друзей. Чтобы легче было писать такие рекурсивные запросы OData вводит дополнительную опцию $level, определяющую глубину рекурсии:

http://yourhost/service/yourdatabase/person(1)?$expand=friends($level=2)

Данный запрос построит дерево (по связи friends) на глубину = 2.

Возможно задать поиск без ограничения глубины рекурсии, указав $levels=max.
Но в этом случае возникает проблема циклических связей. Стандарт не оговаривает, что должно происходить при наличии циклических связей – поэтому в этом случае следует ограничить глубину рекурсии конкретным значением.

Автор: NitrosData

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/javascript/83654

Ссылки в тексте:

[1] предыдущей : http://habrahabr.ru/post/250913/

[2] dezconnect : http://habrahabr.ru/users/dezconnect/

[3] документации OData: http://docs.oasis-open.org/odata/odata/v4.0/odata-v4.0-part1-protocol.html

[4] http://nitrosdata.com/service/testdb/company(company1)?$expand=president: http://nitrosdata.com/service/testdb/company(company1)?$expand=president

[5] http://nitrosdata.com/service/testdb/company(company1): http://nitrosdata.com/service/testdb/company(company1)

[6] Источник: http://habrahabr.ru/post/251185/