Доброе время суток.
Получил вот такую задачу я:
есть sql запрсо вида
"select <список полей> from <список таблиц> where <условия>"
Необходимо по нему построить дерево, а затем построить из этого дерева байткод. Кто-нибудь сталкивался с такой задачей?
Что делает байткод: байткод - последовательность цифр и параметров, передаваемые функциям, которые соответствуют цифрам.
Например:
Как можно разложить в байткода формулу: a+b
1,20,1,15,2
1: взять число (20 - значение числа). Первый раз берётся a, второй раз - b.
2: сумма взятых чисел.
Вот собственно что-то в таком духе надо сотворить для sql запроса.
Прошу помощи. Если кто-либо занимался такой вещью, отзовитесь пожалуйста. Ежели кто-то может помочь, тоже буду рад помощи. А то я уже вешаюсь. Кодер из меня не очень, а задание поставили....
[Ответ]
Yandex 22:52 05.05.2009
Кто понял, расскажите что имел в виду автор топика. Тока по человечьи пожалуйста.
[Ответ]
[Ариец] 23:24 05.05.2009
Yandex, выразился как мог Понимаю что нифига не понятно, но сам слабо понимаю чего от меня хотят.
Попытаюсь ещё раз описАть:
нам надо сделать транслятор к запросу вышеописанного вида такой, чтобы на выходе получалась строка из:
номера команды, параметр к команде (если необходим),номер команды, параметр к команде (если необходим)........ и так далее.
Вобщем я так понимаю итоговый результат - должен получиться небольшой БД сервер. Но это только мои предположения.
[Ответ]
Yandex 08:27 06.05.2009
[Ариец], правильно сформулированная задача - это уже половина решения. А то что я вижу тут:
Сообщение от :
Народ, мне ляниво разбираться! Я ниче не знаю и знать не желаю, так что вы давайте поднапрягитесь, разберитесь и напишите для меня.
P.S. Задачи ведь от фонаря не раздаются кому попало, так ведь?
[Ответ]
dn2k4 09:06 06.05.2009
Yandex, я так понимаю - разбор формул он хочет =)
- получить из базы набор записей
- построить по набору дерево (которое якобы получилось из синтаксического разбора формулы)
- перевести дерево в обратная польскую запись - это которая операции на стеке, типа "push + push + add"
[Ответ]
Сообщение от Yandex:
[Ариец], правильно сформулированная задача - это уже половина решения. А то что я вижу тут:
Я прекрасно это понимаю. Но я передал точны еслова заказчика.
Сообщение от dn2k4:
Yandex, я так понимаю - разбор формул он хочет =)
- получить из базы набор записей
- построить по набору дерево (которое якобы получилось из синтаксического разбора формулы)
- перевести дерево в обратная польскую запись - это которая операции на стеке, типа "push + push + add"
первое мне не надо.
У меня есть запрос, по нему строится дерево. Что такое "обратная польская запись" не представляю Но смысл наверное такой же.
Вобщем в итоге должна получиться "инструкция" к выполнению запроса. Возьми то, сравни с этим, запиши туда и так далее.
[Ответ]
dn2k4 17:07 06.05.2009
Сообщение от [Ариец]:
первое мне не надо. У меня есть запрос, по нему строится дерево
Ну значит надо взять текст запроса, сообразить что является оператором, а что операндом и построить по нему дерево разбора формулы.
на числовом примере
3*(1+2)
дерево разбора будет наподобие
[PHP]
*
| |
+ 3
| |
1 2
[/PHP]
Обратная польская запись из дерева получится обходом снизу вверх:
1 2 + 3 *
dn2k4, точно. Оно
Только это надо сделать не для частного случая, а для общего.
Вобщем кто и за сколько согласится сие сотворить?
Дерево запроса не на языке программирования я построить могу. А вот перенести это в код - нет.
[Ответ]
Yandex 21:20 06.05.2009
[Ариец], дерево запроса это что ли вот так?
Сообщение от :
select a, b, c
from t inner join t2 on t.a = t2.c
where t.a > 1 and t2.c = 3
group by t.b
having avg (t2.c) > 3
order by t.a
Читать снизу вверх
order by t.a
having avg (t2.c) > 3
group by t.b
where t.a > 1 and t2.c = 3
join on t.a = t2.c
select a, b from t | select c from t2
Нафига такое гавно кому то надо? Или я что то не так понял? Постройка для этого запроса дерево.
[Ответ]
dn2k4 22:06 06.05.2009
Сообщение от Yandex:
Нафига такое гавно кому то надо? Или я что то не так понял?
Не позорь взятый ник =)
Твой пример в первом приближении, заменяя операции на функции и учитывая только приоритеты:
[PHP]
order by (t.a)
|
select (a,b,c)
|
group by(t.b)
|
where (t.a>1 and t2.c=3)
|
inner join(on t.a = t2.c)
| |
t t2
[/PHP]
UPD: операнды - множества(строк и колонок). В результате применения функции или операции получаем также множество(строк и колонок). И осталось не забыть про неявную операцию "[select from] t1, t2", дающую декартово произведение множеств.
UPD2: having забыл =/ будет после select(...) и перед group by (...)
[Ответ]
Yandex 22:26 06.05.2009
dn2k4, ник абсолютно от фонаря брался сто лет назад.
Я примерно это и имел в виду. В виду отсутсвия опыта построения деревьев накосячил. Мне кажется и у тебя не все так гладко
Кстати, ANSI SQL (кому он нужен?) можно так разобрать, а вот фичи того же MySQL или Oracle (напр. аналитические функции) околеть проще.
[Ответ]
[Ариец] 22:30 06.05.2009
Ну вот надо оно...
Запрос вида: select t1.f1, t2.f2, ... from t1, t2, t3,.... where (t1.f1=t2.f2)and(t2.f1=t1.f2)and(...)....
[Ответ]
dn2k4 22:51 06.05.2009
<offtop>
Сообщение от Yandex:
абсолютно от фонаря
Ты мне просто иcторию напомнил...
У тебя там раньше над аватаром "Rambler" было написано, да =) Так вот, года три-четыре назад был случай - Наш Лось Яндекс решил поздравить Рамблер с днем рождения. И повесил себе на морду поздравление Рамблера с логотипом Рамблера. Логитип Рамблера был сделан ссылкой на картинку, лежащую непосредственно на серверах поздравляемого. Поздравлений хватило минут на 20, после чего поздравляемый тихо скончался =) Это значит про "от фонаря", да... =)
</offtop>
Сообщение от Yandex:
Мне кажется и у тебя не все так гладко
вполне может быть =) Тут главное - идея построения: операнды -> операции или функции -> декомпозиция функций = рекурсия с учетом приоритетов...
[Ариец], определяйся, что есть операция (функция) а что есть "нечто", над чем операция выполняется. Выделяй сии сущности из текста, вставляй вместо функций поддеревья из операций... ну и получишь искомое.
Тут важно на каком уровне вычислений можно остановится: например - надо ли разбивать функцию отбора where() на более мелкие операции или и так сойдет.
[Ответ]
dn2k4 22:54 06.05.2009
Сообщение от Yandex:
фичи того же MySQL или Oracle (напр. аналитические функции) околеть проще.
Пофиг, сведется к декомпозиции функции на дерево из операторов и параметров
[Ответ]
[Ариец] 23:14 06.05.2009
Сообщение от dn2k4:
Пофиг, сведется к декомпозиции функции на дерево из операторов и параметров
Это как бы в задаче стоит.
Народ, вы не понимаете меня... Теоретически (не на делфях) я это понимаю как сделать. Но как это реализовать на практике - не пойму. Слаб я в делфях. Поэтому и прошу помощи. Естественно за пиво-вознаграждение. Или за что-нибудь другое.
[Ответ]
dn2k4 23:25 06.05.2009
Сообщение от [Ариец]:
Теоретически
Это больное место, да. Теоретическую часть мы разъяснить можем, а на дельфях... этот язык еще и изучить надо.
Сообщение от [Ариец]:
Естественно за пиво
Не, я пас. Теорией помогу. А заставлять тебя пиво в Мск везти - это насилие =)
[Ответ]
MadFish 09:24 07.05.2009
читал-читал ... нифига не понял... похоже тупею... Ему надо синтаксический разбор sql запроса и кодогенерацию в "байт код" или я туплю??? А целевая машина описана?(в смысле этот самый "байт код")
[Ответ]
[Ариец] 18:19 07.05.2009
MadFish, да, это и надо.
Целевая машина не описана. Её тоже надо будет написать. Или хотя бы составить сопоставить список команд их номера.
[Ответ]
MadFish 11:59 08.05.2009
зашибись. ходи туда не знаю куда принеси то не знаю что. это вам дорогой товарищь к сказочникам а не к программистам )) и раз ты
Сообщение от [Ариец]:
Теоретически (не на делфях) я это понимаю как сделать.
то описывай целевую машину и таблицы переходов состояний для лексического и синтаксического анализаторов, а уж написать конечный автомат с магазинной памятью на дельфях мы тебе поможем. А с подходом "сделатейте все за меня" готовь баксов 500 и тебе все сделают красиво.
[Ответ]
[Ариец] 13:04 08.05.2009
MadFish, возможно я неверно выразился.
мне нужна лишь трансляция запроса в байт-код.
Я так понял что целевая машина, это то что потом обрабатывает и выполняет этот байт код? Вот это не надо. она не оговорена и свободная. То есть порядковые номера определяем сами. Завтра буду дома - напишу то, что мне рассказали и посоветовали как делать.
[Ариец], похоже даже теоритических знаний у тебя нет. продолжать дискуссию не вижу смысла. про 500 баксов я не загнул. задачи такого плана -дерьмовенький диплом. приблизительно столько и стоит.
[Ответ]
[Ариец] 18:05 08.05.2009
MadFish, ну хорошо что у вас есть теоретические знания. Умничайте дальше.