API сервера OData и синтаксис выражений, литералы и члены - PullRequest
0 голосов
/ 20 мая 2019

Я хочу перевести запрос OData в запрос MongoDB. У меня есть код olingo-odata4 и я изолировал вызовы, необходимые для ввода строки ввода, например,

Name eq 'Buzz' and (amount gt 1.99 or size lt 10) 

и запустить его через ExpressionParser с моей собственной реализацией ExpressionVisitor для перехвата различных состояний анализа, таких как visitLiteral, visitBinaryOperator и т. Д. Оттуда тривиально создать эквивалентный запрос MongoDB. Мой main по сути является урезанной копией тестовых драйверов odata, включая макет класса Edm для запуска:

ExpressionParser ep = new ExpressionParser(mock(Edm.class), odata);

Моя проблема в том, что я не могу правильно настроить среду, чтобы синтаксический анализатор распознавал поля, например, члены. Я бы надеялся, что Name eq 'Buzz' вызовет метод visitMember для вызова Name, но это не так; вместо этого я получаю сообщение об ошибке: Property paths must follow a structured type.

Таким образом, мой общий вопрос звучит так: если аргумент $filter для OData показывает синтаксис выражения как Name eq 'Buzz', то что должно произойти в реализации сервера для распознавания Name в качестве члена?

1 Ответ

0 голосов
/ 30 мая 2019

Парсер, к сожалению, слишком тесно связан с моделью данных, ИМХО.Тестовые драйверы, на которых я смотрел, были в основном {5 eq 5} и тому подобное, поэтому я сбился с пути.Однако драйвер теста пути к свойствам не может издеваться над EDM;он должен создать модель, чтобы объявить тип (строку и т. д.) полей.Вот почему класс visitMember Member имеет метод getType().Но это означает, что вы не можете использовать синтаксический анализатор, чтобы просто взломать синтаксис и динамически выполнять действия с результатами.

В итоге я просто создал очень маленькую грамматику в ANTLR для разбора выражений запроса OData, и ее было легко преобразовать.на язык запросов MongoDB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...