Как разобрать базовый запрос (а-ля Google Data) в Java?

У меня есть система, в которой я запрашиваю документы на сервере REST / Atom. Запросы основаны на GData и выглядят так:

http://server/base/feeds/documents?bq=[type in {'news'}]

Мне нужно проанализировать параметр «bq», чтобы узнать, какой тип документов будет возвращен, без фактического выполнения запроса. Так, например,

bq=[type = 'news']                      ->  return ["news"]
bq=[type in {'news'}]                   ->  return ["news"]
bq=[type in {'news', 'article'}]        ->  return ["news", "article"]
bq=[type = 'news']|[type = 'article']   ->  return ["news", "article"]
bq=[type = 'news']|[title = 'My Title'] ->  return ["news"]

По сути, язык запросов - это список предикатов, которые можно комбинировать с OR ("|") или AND (без разделителя). Каждый предикат является ограничением для поля. Ограничение может быть =, <,>, <=,> =, in и т.д ... Пробелы могут быть везде, где это имеет смысл.

Я немного потерялся между Regexp, StringTokenizer, StreamTokenizer и т.д ... и я застрял с Java 1.4, поэтому нет Parser ...

Кто может указать мне правильное направление?

Спасибо !

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
433
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Правильный способ - использовать генератор парсеров, например Antlr, JFlex или JavaCC.

Быстрый и грязный способ:

String[] disjunctedPredicateGroups = query.split("\|");
List<String[]> normalizedPredicates = ArrayList<String[]>;
for (String conjunction : disjunctedPredicateGroups ) {
   normalizedPredicates.add(conjunction.split("\[|\]"));
}
// process each predicate

Другие вопросы по теме