SQLToMongoDBTranslator - транслятор из SQL в команды MongoDB.
mvn test- запуск тестов.mvn compile exec:java- запуск Main класса (читает из входного потока линии сsql queryи пишет в выходной потокsql query -> mongoDB query, если запрос корректный и успешно транслирован, илиsql query -> Xиначе).
- Поддерживаются только SELECT запросы.
- Запрос может содержать WHERE, LIMIT, SKIP блоки.
- WHERE блок должен идти перед SKIP и LIMIT блоками.
- SKIP и LIMIT блоки могут идти в любом порядке относительно друг друга.
- Блок WHERE может содержать только один предикат - сравнение двух аргументов с использованием одного из операторов: <, >, =, <>.
- Аргументы в предикате WHERE блока должны содержать название колонки и значение поля (необходимо для трансляции в соответствующие предикаты команды find).
- Поддерживаются типы значений полей - строки, целые числа.
Заглавными буквами указаны нетерминалы, строчными - терминалы.
QUERY->selectCOLUMN_NAMESfromnameWHERE_PARTSKIP_LIMIT_PARTCOLUMN_NAMES->star|nameCOLUMN_NAMES_CONTCOLUMN_NAMES_CONT->commanameCOLUMN_NAMES_CONT|εWHERE_PART->whereCONDITION|εCONDITION->namecomparing_opFIELD_VALUE|FIELD_VALUEcomparing_opnameFIELD_VALUE->string|neg_int|pos_intSKIP_LIMIT_PART->ABS_SKIP_PARTLIMIT_PART|ABS_LIMIT_PARTSKIP_PART|εSKIP_PART->ABS_SKIP_PART|εABS_SKIP_PART->skippos_intLIMIT_PART->ABS_LIMIT_PART|εABS_LIMIT_PART->limitpos_int
Строкое представление терминалов (приведены регулярные выражения):
select,from,where,skip,limit- соответствующие ключевым словам строки, каждая буква в которых может быть в любом регистре.name-[_a-zA-Z][_a-zA-Z0-9]*(кроме строк, соответствующих ключевым словам)string-'(\\.|[^\\'])*'neg_int--[0-9]+pos_int-[0-9]+comparing_op-<|>|=|<>star-*comma-,
Множества FIRST и FOLLOW:
| Нетерминал | Описание | FIRST | FOLLOW |
|---|---|---|---|
QUERY |
Запрос | select |
$ |
COLUMN_NAMES |
Список колонок | star, name |
from |
COLUMN_NAMES_CONT |
Продолжение списка колонок | comma, from |
from |
WHERE_PART |
Часть с WHERE блоком | where, skip, limit, $ |
skip, limit, $ |
CONDITION |
Предикат WHERE блока | name, string, neg_int, pos_int |
skip, limit, $ |
FIELD_VALUE |
Значение поля | string, neg_int, pos_int |
comparing_op, skip, limit, $ |
SKIP_LIMIT_PART |
Часть со SKIP и LIMIT блоками | skip, limit, $ |
$ |
SKIP_PART |
Часть со SKIP блоком | skip, $ |
$ |
ABS_SKIP_PART |
SKIP блок | skip |
limit, $ |
LIMIT_PART |
Часть с LIMIT блоком | limit, $ |
$ |
ABS_LIMIT_PART |
LIMIT блок | limit |
skip, $ |
Часть с (???) блоком ~ блок в ней может как быть, так и не быть.